【问题标题】:visual studio c# DataGridView maintain background color after sortvisual studio c#DataGridView在排序后保持背景颜色
【发布时间】:2015-01-03 03:08:05
【问题描述】:

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

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

这工作正常,直到我单击 DataGridView 中的列排序按钮。我想知道是否有办法在排序后保持背景颜色,而不考虑单元格的文本值。一旦我设置了该单元格的背景颜色,它就会在排序后记住该背景颜色。

我见过其他使用

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

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

有什么帮助吗?

【问题讨论】:

  • 没有保持颜色。如果您需要维护某些东西(重新创建后存在),您将必须提供一种存储/恢复它的方法。以 每一行 的颜色列表为例,然后您可以将其用于单元格的格式设置或所有者绘图。
  • 我不知道该怎么做...你能举个例子吗?有没有办法在处理程序中获取 DataGridView 单元格(e.RowIndex 和 e.ColumnIndex)并提取该单元格与原始 DataTable 关联的 rowIndex 和 colIndex?
  • 您可以使用不可见(不显示)列来保存您需要的数据。在winforms中到处都有Tag属性,专门用于保存自定义数据。
  • 我尝试使用标签,但没有成功。所有标签都恢复为空。这是因为,正如你所说,细胞正在被重新创造吗? if(grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Tag != null)
  • 是的,你是对的,二维数组是行不通的。你需要一些key。然后,显然,颜色应该在DataTable(作为不可见列)中定义,请参阅this 以隐藏列(我假设您的列是自动生成的,如果不是,那么不可见列很容易)。这个不可见的列就像Tag for DataRow

标签: c# winforms datagridview datatable


【解决方案1】:

使用“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; }
    }

【讨论】:

    【解决方案2】:

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

    总的来说,我觉得这些步骤是绕过设计不佳且有缺陷的 DataGridView 的技巧。我无法想象您想要为单元格着色,然后在排序后让它恢复颜色的场景。在我看来,排序只是一种重新排列,不会改变属性或值。我确信 DataGridView 对于这么多的应用程序来说是伟大而灵活的,但这似乎是一个基本的错误或设计缺陷。

    【讨论】:

      【解决方案3】:

      我知道这有点老了,但是为 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 2020-05-29
        相关资源
        最近更新 更多