0

我有一个启用了垂直滚动条的虚拟DataGridView (DGV)。DGV 是只读的。事件CellValueNeeded得到正确处理。一开始,行数少于可以显示的行数,并且未绘制滚动条。那是对的。

在第二个线程(线程...->开始)中,我添加了新行。仍然在这个线程中,我DGV->RowCount根据总行数进行更新并调用DGV->Invalidate( true ),希望在必要时绘制滚动条。

然后我观察到一个奇怪的行为:虽然CellValueNeeded仍然被正确调用,但滚动条的区域并没有失效。它显示为“未重绘”区域。如果我最小化表单然后恢复它,滚动条将显示为黑色矩形。就像滚动条本身有Visible=false.

我什至尝试将a 和 a 之间的值放在DGV->RowCountaDGV->ScrollBars=ScrollBars::None;和 aDGV->ScrollBars=ScrollBars::Vertical;之间DGV->SuspendLayout()DGV->ResumeLayout()但两次尝试的行为仍然相同。

许多问题:

  1. 更新DGV->RowCount处理是否正确?我在第二个线程中执行此操作,而不是在主线程中,因为我天真地认为 DGV 是纯只读的,它不会引起任何冲突。也许我错了?
  2. Invalidate() (也在第二个线程中调用,因为它只在队列中添加一条消息,不是吗?)足以使滚动条出现吗?

我在网上看到了几条关于 DataGridView 滚动条问题的消息。此功能有错误吗?

4

1 回答 1

0

这是解决方案:

DGV->RowCount不能在第二个线程上完成。我猜是因为滚动条会在这个线程上实例化,而不是在主(GUI)线程上。这是不好的。

所以,我写了一个这样的小方法:

void MyClass::UpdateRC( void )
{
    DGV->RowCount = ...;
}

然后我从第二个线程这样称呼它:

Invoke( gcnew MethodInvoker( this, &MyClass::UpdateRC ) );

一切正常!

瞧!我希望这将帮助所有在未来面临同样问题的人。

于 2013-11-14T18:53:09.843 回答