C#DataGridView - 正确处理基于值的条件行样式

时间:2015-12-15 19:17:34

标签: c# checkbox datagridview

我有一个带有复选框列和一些文本列的DataGridView,我想要检查其复选框列的任何行都有不同的BackColor。我使用CellValueChanged事件来根据需要突出显示单元格,这很好地工作,除了在某些情况下格式化失败。

如果我在网格中添加10行,并按降序排列复选框列(在顶部检查行),然后检查前5行中的复选框,它们都会突出显示。但是,如果我然后取消选中其中一个(假设第二行),CellValueChanged事件将按预期触发,这会突出显示第二行。当我离开行并选择另一行时,列排序开始并向下推#2行,这样它现在是#5行,这也是正确的。

问题是排序在格式化之后发生,因此旧的行样式现在应用于该点中现在的任何行。在图片中显示可能更容易。顶部屏幕截图显示了正确的设置,然后我取消选中#结尾为“144”的行并切换到最后一行。结果是144从第2行移动到第5行,现在第2行具有“未突出显示”的样式,即使数据行已选中该框:

screenshots

一些补充信息:我允许用户通过单击选中复选框,或者他们也可以多选行并点击空格键以切换复选框。当我切换复选框时,我将DataGridViewCell对象的Value属性设置为true或false。

无论如何,我试图想出一个解决这个UI问题的好方法,而不是每次遍历网格中的每一行,这看起来真的很无用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,Ivan Stoev在评论中提供的链接指的是允许您自定义该行为的各种绘画事件。虽然我实际上没有自定义绘制逻辑本身,但是事件在正确的时间触发,并且它们仅针对可见行触发,因此我能够简单地将格式化方法移动到RowPostPaint事件中。