gpt4 book ai didi

c# - 调用 InvalidateCell 时 DataGridView 不调用 Paint 方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:20 25 4
gpt4 key购买 nike

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

我有一个 DataGridView,我需要一个自定义类型的 DataGridViewColumn,以便当我的鼠标悬停在该列的某个单元格上时,该单元格会在其上绘制一些特殊的东西。我找到了 a way覆盖 DataGridViewTextBoxCell 以自己进行绘画。那篇文章展示了一个实现翻转单元格的示例,当您将鼠标移到单元格上时,它会在其自身的边界周围绘制一个红色矩形。

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

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

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

感谢您的建议。

最佳答案

不太确定我是否理解您的问题。看看这是否有点像您需要的:

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;
}
}

关于c# - 调用 InvalidateCell 时 DataGridView 不调用 Paint 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1292170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com