visualstudioc#DataGridView在排序后保持背景颜色

本文关键字:背景 颜色 排序 visualstudioc#DataGridView | 更新日期: 2023-09-27 18:29:20

我用包含纯文本的DataTable填充了DataGridView。后来,我使用设置了一个特定单元格的背景颜色

grid.Rows[row].Cells[col].Style.BackColor = setColor;

在我点击DataGridView中的列排序按钮之前,这一切都很好。我想知道是否有一种方法可以在排序后保持背景色,而不考虑单元格的文本值。一旦我设置了单元格的背景色,它就会在排序后记住背景色。

我见过其他使用的例子

CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)

事件处理程序,但他们在这里编写的代码似乎总是对单元格背景相对于单元格文本内容的颜色有一个先入为主的概念(例如:if cellText=="Critical"…)。这在我的情况下不起作用,我只需要它记住哪些单元格被设置为特定的颜色。

有什么帮助吗?

visualstudioc#DataGridView在排序后保持背景颜色

使用"DataBindingComplete"事件!

例如

    private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        foreach (DataGridViewRow row in dataGridView1.Rows)
            if (Convert.ToDateTime(row.Cells["Effective Date"].Value) > DateTime.Now)
            {
                row.DefaultCellStyle.BackColor = Color.LightYellow;
            }
            else { row.DefaultCellStyle.BackColor = Color.LightGreen; }
    }

以下是我必须做的(多亏了Sinatr的指针):我必须创建第二个DataTable,它只用于跟踪哪些单元格是什么颜色。然后,我不得不向DataGridView添加一个隐藏列,该列用作键。我把DataTable的行号放在这个字段中,这样在对它进行排序后,我就可以使用行号键来确定我的颜色表中的行索引。我在DataGridView的CellFormatting中添加了代码来检查颜色表并重新应用颜色格式。更复杂的是,我在让第一列变得不可见方面遇到了问题,所以我必须确保我的隐藏列不是第一列。

总的来说,我觉得这些步骤是绕过设计糟糕和有缺陷的DataGridView的技巧。我无法想象这样一种情况:你想给一个单元格上色,然后在排序后让它恢复颜色。在我看来,排序只是一种重新排列,而不是改变属性或值。我确信DataGridView对于许多应用程序来说是非常好和灵活的,但这似乎是一个基本的错误或设计缺陷。

我知道这有点过时,但给DataGridView单元格上色和保持颜色的正确方法是使用RowPrePaint事件。这样,您就不必在将来对DataGridView进行任何更改时"手动"重新处理这些行。

我所做的是添加额外的列,或者您可以使用一个单独的数据表来保存更改。然后使用这个事件做类似的事情:

    private void dgvResults_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        bool.TryParse(dgvResults.Rows[e.RowIndex].Cells["IsChanged"].Value.ToString(), out bool bIsChanged);
        if(bisChanged)
           dgvUsers.Rows[e.RowIndex].Cells["MyCellName"].Style.BackColor = Color.Salmon;
    }