【问题标题】:DataGridView dynamic selected row ColorDataGridView 动态选中行颜色
【发布时间】:2014-04-09 02:08:17
【问题描述】:

我正在处理从System.Windows.Forms.DataGridView 派生的自定义DataGridView

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

当我选择一行时,我只是想保留该行的先前颜色,然后相对地突出显示该颜色,我已经用这段代码 sn-p:

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 何时更改,我知道某些行的选择状态发生了变化,但我不知道哪一行是我要更改颜色的上一行。

是否有任何解决方法可以做到这一点?任何事件或特殊代码?


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

【问题讨论】:

    标签: c# .net winforms datagridview colors


    【解决方案1】:

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

    示例代码:

    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;
                }
            }
        }
    }
    

    【讨论】:

    • 您的代码很有帮助,它只需要一件事,由于状态(列之一),每一行可能有自己的颜色,当该行被取消选择时,我应该将该行的背景颜色重置为它是特定的先前颜色,而不是常见的 defaultStyle。
    • @MahdiTahsildari - 仅更改了 SelectionBackColor。该行的 BackColor 根本没有被修改。所以,你不必担心这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多