c# 从 DataGridView 设置和重置颜色

c# Set and Reset Color from DataGridView

大家好,我使用 DataGridViewCell.Style 属性 为我点击的每个单元格设置背景颜色。

if (e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
{
    return;
}
var dataGridViewCellStyle = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
{
    BackColor = Color.CornflowerBlue
};
dataMenu[e.ColumnIndex, e.RowIndex].Style = dataGridViewCellStyle;

看起来完全像这样:

但现在我希望如果我单击同一列中的另一个单元格,整个列将背景颜色更改为白色,然后再将下一个单元格设置为 'Color.CornflowerBlue'

我想避免同一列中的多个单元格可以具有相同的颜色。 对于每一列,应该只能在一个单元格上设置颜色!

应该不可能做这样的事情: 正如您在“Montag”列中看到的那样,可以更改多个单元格的颜色。 我希望如果我现在单击“Montag”中的另一个单元格,则应重置整个列并在新的聚焦单元格上设置颜色。

我已经尝试过这段代码:

 dataMenu.Columns[e.ColumnIndex].DefaultCellStyle.BackColor = Color.Red;

但这只改变了我写在上面的第一个 BackColor Set 函数后面的 BackColor post。

在设置单元格样式之前,清除同一列上其他单元格的样式。只需对您的初始代码稍作修改

private void DataMenu_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
    {
        return;
    }
    for (int i = 0; i < dataMenu.Rows.Count; i++)
    {
        var cell = dataMenu[e.ColumnIndex, i];
        if (cell.HasStyle)
        {
            cell.Style = null;
        }
    }
    var style = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
    {
        BackColor = Color.CornflowerBlue
    };
    dataMenu[e.ColumnIndex, e.RowIndex].Style = style;
}

我在重现您的问题时注意到一些 side-effects。决定给出额外的建议,以防万一

设置SelectionBackColorSelectionForeColor默认单元格样式与未选中状态相同

dataMenu.DefaultCellStyle.SelectionBackColor = dataMenu.DefaultCellStyle.BackColor;
dataMenu.DefaultCellStyle.SelectionForeColor = dataMenu.DefaultCellStyle.ForeColor;

您也可以在设计器中完成。 Select 您在设计器中的数据网格视图。在 属性 网格中修改 DefaulCellStyle 属性.

在代码中设置单元格的 Style 时执行相同的操作。

style.SelectionBackColor = style.BackColor;
style.SelectionForeColor = style.ForeColor;
dataMenu[e.ColumnIndex, e.RowIndex].Style = style;

如果您需要取消选择已选择的单元格,那么您可以使用以下代码。如果单击选定的单元格,它会取消选择。

private void DataMenu_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
    {
        return;
    }
    var cell = dataMenu[e.ColumnIndex, e.RowIndex];
    if (cell.HasStyle)
    {
        cell.Style = null;
    }
    else
    {
        var style = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
        {
            BackColor = Color.CornflowerBlue
        };
        style.SelectionBackColor = style.BackColor;
        style.SelectionForeColor = style.ForeColor;
        cell.Style = style;
        for (int i = 0; i < dataMenu.RowCount; i++)
        {
            if (i != e.RowIndex)
            {
                dataMenu[e.ColumnIndex, i].Style = null;
            }
        }
    }
}