DataGridView动态选择行颜色

时间:2014-03-06 12:26:12

标签: c# .net winforms datagridview colors

我正在处理源自DataGridView的自定义System.Windows.Forms.DataGridView

在我想要的网格中,我的行可能由于它们的状态而具有不同的颜色,并且我希望当前行与其他行略有不同,并且该差异是突出显示的颜色,这是动态的而不是静态的。

当我选择一行时,我只想保留该行的先前颜色,然后相对地高亮显示该颜色,我已经完成了这段代码:

Color oldColor;
private void dgvMain_SelectionChanged(object sender, EventArgs e)
{
    oldColor = dgvMain.CurrentRow.DefaultCellStyle.BackColor;
    Color newColor = Color.FromArgb(oldColor.R  < 235 ? oldColor.R + 20 : 0,
                                    oldColor.G, oldColor.B);
    dgvMain.CurrentRow.DefaultCellStyle.BackColor = newColor;
}

但我有两个问题:

  1. 当我选择一行时,首先我的代码会更改行的颜色,然后选择该行,使其颜色更改为默认选择颜色。
  2. 当该行丢失其选择(被删除)时我无法恢复它的旧颜色 - 我有oldColor但我不知道何时更改CurrentRow,我知道有些行已经改变了选择状态,但我不确切知道哪一行是我前一行改变它的颜色。
  3. 有没有解决方法可以做到这一点?任何事件或特殊代码?


    如果您知道更好的突出颜色解决方案,我将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

SelectionBackColor中有一个单独的属性DefaultCellStyle。使用此选项可更改选择颜色。您可以存储默认的单元格样式,并使用它来恢复默认值。

示例代码:

public class BetterDataGridView : DataGridView
{
    private DataGridViewCellStyle defaultStyle = new DataGridViewCellStyle();
    public BetterDataGridView()
    {

    }

    protected override void OnRowStateChanged(int rowIndex, DataGridViewRowStateChangedEventArgs e)
    {
        base.OnRowStateChanged(rowIndex, e);
        if (rowIndex > -1)
        {
            DataGridViewRow row = this.Rows[rowIndex];
            if (row.Selected)
            {
                Color oldColor = this.CurrentRow.DefaultCellStyle.SelectionBackColor;
                e.Row.DefaultCellStyle.SelectionBackColor = Color.FromArgb(oldColor.R < 235 ? oldColor.R + 20 : 0,
                                    oldColor.G, oldColor.B);
            }
            else if (!row.Selected)
            {
                e.Row.DefaultCellStyle.SelectionBackColor = defaultStyle.SelectionBackColor;
            }
        }
    }
}