DataGridView垂直ScrollBar不是在Invalidate()上绘制的?

时间:2013-11-14 16:53:26

标签: .net winforms datagridview c++-cli .net-4.5

我有一个启用了Vertical ScrollBar的虚拟 DataGridView(DGV)。 DGV是ReadOnly。事件CellValueNeeded已正确处理。开始时,行计数小于可显示的行数,并且不绘制滚动条。那是正确的。

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

然后我发现了一个奇怪的行为:当CellValueNeeded仍被正确调用时,滚动条的区域不会失效。它看起来像是一个“没有重绘”的区域。如果我最小化表单然后恢复它,滚动条显示为黑色矩形。就好像滚动条本身有Visible=false

我甚至尝试将DGV->RowCount置于DGV->ScrollBars=ScrollBars::None;DGV->ScrollBars=ScrollBars::Vertical;之间,然后介于DGV->SuspendLayout()DGV->ResumeLayout()之间,但行为保持不变两次尝试。

很多问题:

  1. 是否正确处理了DGV->RowCount次更新?我在第二个线程中,而不是在主线程中,因为我天真地认为DGV纯粹是ReadOnly,它不会引起任何冲突。也许我错了?
  2. Invalidate()(也在第二个线程中调用,因为它只在队列中添加一条消息,没有?)足以使滚动条出现?
  3. 我在网上看到了一些关于DataGridView滚动条有问题的消息。这个功能有错误吗?

1 个答案:

答案 0 :(得分:0)

以下是解决方案:

DGV->RowCount无法在第二个帖子上完成。我想因为滚动条将在此线程上而不是在主(GUI)线程上实例化。这很糟糕。

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

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

然后我从第二个帖子中调用它:

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

一切正常!

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