DataGridViewCheckboxCell的背景颜色

时间:2010-09-07 15:57:24

标签: c# winforms datagridview datagridviewcheckboxcell

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

尽管我尽最大努力阻止它,但看起来看起来正在进行细胞选择。我的单元格格式代码设置SelectionBackColor以及BackColor。我已使用CellStateChanged事件禁用了单元格选择,并且其他列都不可选:

private void PlayerGrid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

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;

         }
}