调用InvalidateCell时,DataGridView不调用Paint方法

时间:2009-08-18 06:39:43

标签: c# winforms datagridview

这是一个WinForm C#应用程序问题。

我有一个DataGridView,我需要一个自定义类型的DataGridViewColumn,这样当我的鼠标位于该列上的一个单元格上时,该单元格会在其上绘制特殊内容。我发现a way覆盖了DataGridViewTextBoxCell来自己进行绘画。那篇文章展示了一个实现翻转单元格的示例,这样当您将鼠标移动到单元格上时,它会在其自身的边缘周围绘制一个红色矩形。

如果您看到该示例,您将发现示例填充数据的方式是直接向网格创建行。当我使用数据绑定而不是直接行填充时,我发现单元格在开始时不会自己绘制。实际上,您必须先选择一个单元格,然后该行上的所有单元格都将正确绘制。如果您没有选择行的单元格,则当鼠标悬停在该行上时,该行上的所有单元格都不会相应地进行绘制。

我认为这是网格的某种优化,当你选择一个单元格时,该行的底层对象被激活,并且当调用InvlidateCell方法时,网格将调用Paint方法。但是如果没有激活行的基础对象,网格将只按默认方法绘制单元格以节省时间。

显然,我不需要优化,但需要缓慢的方式。在我的情况下并不重要,因为我在该网格上的数据永远不会太大。我怎样才能实现它?我试图在数据绑定到网格后调用grid.Refresh(),但这没有帮助。

感谢您的建议。

2 个答案:

答案 0 :(得分:0)

不完全确定我理解你的问题。看看这有点像你需要的那样:

bool bSomeFlag = false;
int iCol = 0;
int iRow = 0;
private void dataGridView1_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e) {
            iCol = e.ColumnIndex;
            iRow = e.RowIndex;
            bSomeFlag = true;
            this.dataGridView1.Invalidate();
        }
private void dataGridView1_Paint(object sender, PaintEventArgs e) {
            if (bSomeFlag && iRow >=0 && iCol>=0) {
                dataGridView1.Rows[iRow].Cells[iCol].Style.BackColor = Color.Red;
            }
        }

答案 1 :(得分:0)

我一直在努力解决同一个问题,问题是DataGridViewImageButtonCell : DataGridViewTextBoxCell中的任何方法都是使用对象属性RowIndex = -1调用的,因此InvalidateCell()会被{{1}触发没有任何反应。

这是由rows being shared

引起的
  

当RowIndex属性返回-1时,单元格是列标题,或单元格的行共享

MSDN shows some ways如何保持行共享(因此违背它们=取消共享行),包括:

  

例如,以下任何一项都无法共享行   情况:

     
      
  • 该行包含一个不在选定列中的单个选定单元格。
  •   
  • 该行包含一个设置了ToolTipText或ContextMenuStrip属性的单元格。
  •   
  • 该行包含DataGridViewComboBoxCell及其Items属性设置。
  •   
     

...

     

不要处理DataGridViewRowCollection.CollectionChanged或 DataGridView.RowStateChanged 事件。这些事件导致行不被共享。另外,不要调用引发这些事件的DataGridViewRowCollection.OnCollectionChanged或DataGridView.OnRowStateChanged方法。

我尝试过使用:

rowIndex = -1

它有效,但我讨厌默认取消共享行的想法,所以我最终通过重载扩展了我的public MyDataGridView() : base() { RowStateChanged += MyDataGridView_RowStateChanged; } void MyDataGridView_RowStateChanged( object sender, DataGridViewRowStateChangedEventArgs e ) { } 类:

所以最终的工作代码如下:

Cell