3

我有一个DataGridView对象列表的绑定,并且我正在使用该CellFormatting事件设置动态单元格背景颜色,如this answer中所示。这适用于除DataGridViewCheckboxColumn. 当我在此单元格内部(但在复选框外部)单击时,单元格背景变为默认白色。

尽管我尽最大努力阻止它,但从视觉上看,它似乎正在发生细胞选择。我的单元格格式代码设置SelectionBackColor以及BackColor. 我已经使用该CellStateChanged事件禁用了单元格选择,并且其他列均不可选择:

私人无效 PlayerGrid_CellStateChanged(对象发送者,DataGridViewCellStateChangedEventArgs e)
{
    如果(e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = 假;
}

是否有额外的解决方法来覆盖复选框的单元格行为?

4

2 回答 2

2

我通过将以下代码添加到CellStateChanged事件中找到了解决方法:

if (e.Cell is DataGridViewCheckBoxCell)
      e.Cell.Style.BackColor = BackgroundColor(e.Cell.RowIndex);

BackgroundColor()根据行计算单元格背景颜色。)

这可以解决问题,但可能会通过创建额外的样式对象而导致更大或虚拟表的性能问题。

于 2010-09-09T10:28:09.190 回答
0

对于我正在做的事情,我更喜欢这种方法。它能够通过鼠标单击或 Tab 更改任何 DataGridView 单元格的背景颜色(包括复选框)——例如目的——以突出显示当前选定的单元格。我发现其他方法奇怪地没有为​​复选框的背景着色,因为其他单元格类型被着色。在我的示例中,我在 CellFormatting 事件中使用了这种方法,但我相信类似的语法可以在其他地方成功复制。此外,我相信这更接近地回答了与 CellFormatting 事件相关的 OPs 问题。

void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {


if (W.mf.dgv.CurrentCell != null && e.RowIndex==W.mf.dgv.CurrentCell.RowIndex & e.ColumnIndex==W.mf.dgv.CurrentCell.ColumnIndex)
         {

                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Color.YellowGreen;

         }
         else
         {
                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = W.mf.dgv.DefaultCellStyle.SelectionBackColor;

         }
}
于 2015-06-30T16:08:07.593 回答