这是一个WinForm C#应用程序问题。
我有一个DataGridView,我需要一个自定义类型的DataGridViewColumn,这样当我的鼠标位于该列上的一个单元格上时,该单元格会在其上绘制特殊内容。我发现a way覆盖了DataGridViewTextBoxCell来自己进行绘画。那篇文章展示了一个实现翻转单元格的示例,这样当您将鼠标移动到单元格上时,它会在其自身的边缘周围绘制一个红色矩形。
如果您看到该示例,您将发现示例填充数据的方式是直接向网格创建行。当我使用数据绑定而不是直接行填充时,我发现单元格在开始时不会自己绘制。实际上,您必须先选择一个单元格,然后该行上的所有单元格都将正确绘制。如果您没有选择行的单元格,则当鼠标悬停在该行上时,该行上的所有单元格都不会相应地进行绘制。
我认为这是网格的某种优化,当你选择一个单元格时,该行的底层对象被激活,并且当调用InvlidateCell方法时,网格将调用Paint方法。但是如果没有激活行的基础对象,网格将只按默认方法绘制单元格以节省时间。
显然,我不需要优化,但需要缓慢的方式。在我的情况下并不重要,因为我在该网格上的数据永远不会太大。我怎样才能实现它?我试图在数据绑定到网格后调用grid.Refresh(),但这没有帮助。
感谢您的建议。
籍
答案 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}触发没有任何反应。
当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