【问题标题】:C# DataGridView - Properly handling conditional, value-based row stylingC# DataGridView - 正确处理有条件的、基于值的行样式
【发布时间】:2015-12-15 19:17:34
【问题描述】:

我有一个带有复选框列和一些文本列的 DataGridView,我希望任何选中其复选框列的行都具有不同的背景色。我使用 CellValueChanged 事件根据需要突出显示单元格,这工作得很好,除了在某些情况下格式不正常。

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

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

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

无论如何,我正在尝试一种解决此 UI 问题的好方法,而无需每次都循环遍历网格中的每一行,这似乎非常低效。有什么想法吗?

【问题讨论】:

  • 非常好——我只是将格式化方法移到了 RowPostPaint 事件中,现在它的效果要好得多,并且可以捕捉到以前错过的所有各种场景。您想添加相同的链接/评论作为答案而不是评论吗?
  • 欢迎您的朋友,很高兴这对您有所帮助。我不认为仅仅提供一个链接就应该是一个答案,但感谢您的提议!

标签: c# checkbox datagridview


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 2015-09-27
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2012-04-17
    • 2012-03-26
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多