【问题标题】:DataGridView change cells background and restore default styleDataGridView 更改单元格背景并恢复默认样式
【发布时间】:2018-05-25 12:47:12
【问题描述】:

在我的 DGV 中,单击一个单元格后,我想用某个值更改同一列的所有单元格的背景颜色。单击另一个单元格后,前一个单元格(及其所有列)必须恢复默认样式

        int    currCell = dgvLogHeader.CurrentCell.ColumnIndex;
        string pattern = dgvLogHeader.CurrentCell.Value.ToString();
        dgvLogHeader.AlternatingRowsDefaultCellStyle.BackColor = SystemColors.ScrollBar;
        dgvLogHeader.DefaultCellStyle.BackColor = SystemColors.Info;

        for (int j=0; j < dgvLogHeader.Rows.Count; j++ ) {
            //dgvLogHeader.Columns[currCell].
            if (dgvLogHeader.Rows[j].Cells[currCell].Value.ToString() == pattern) {
                dgvLogHeader.Rows[j].Cells[currCell].Style.BackColor = Color.Brown;
            }
        }

但是之后单元格改变了背景并且默认样式丢失了。

【问题讨论】:

  • 确保重置不再应该被标记的单元格。为此,请将颜色设置为 Color.Empty!
  • 我必须记住所有重绘的单元格吗?为什么不工作 dgvLogHeader.AlternatingRowsDefaultCellStyle.BackColor = SystemColors.ScrollBar; dgvLogHeader.DefaultCellStyle.BackColor = SystemColors.Info;
  • 它不会覆盖单独设置单元格的颜色。这些将始终显示其各自的颜色,直到您将其重置为 Color.Empty。
  • 有没有一种快速的方法来进行颜色重置和绘制新单元格?不是通过周期,在一个周期中它很慢,在我看来
  • 查看我的回答:理想情况下,它只使用两次调用,一次重置最后一列,一次为当前列着色..

标签: c# datagridview styles


【解决方案1】:

这是一种方法:

private void dgvLogHeader_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    foreach (DataGridViewColumn col in dgvLogHeader.Columns)
    {
        if (col.DefaultCellStyle.BackColor != Color.Empty)
            col.DefaultCellStyle.BackColor = Color.Empty;
    }
    dgvLogHeader.Columns[e.ColumnIndex].DefaultCellStyle.BackColor = Color.Gainsboro;
}

这首先将每列的颜色重置为默认值 (Color.Empty),然后为当前列着色。

请注意,这不会重置您在单个单元格中设置的任何颜色!

重置您需要将每个设置为Color.Empty

你可能想添加一个

dgvLogHeader.ClearSelection();

清除对单击单元格的选择。

但是:如果您需要根据单元格值逐个决定颜色,那么您将不得不循环遍历单元格。这最好在CellPainting 事件中完成,因为它以优化的方式调用以仅包含显示的单元格。请注意,它是基于每个单元格调用的,因此您需要遵守 e.ColumnIndexe.RowIndex 值..

更新:现在你已经澄清了问题,确实你需要循环一个所有或所有可见单元格..

这是一个你可以调用的函数:

private void markCells(DataGridView dgv, string pattern)
{
    dgv.SuspendLayout();

    foreach (DataGridViewRow row in dgv.Rows)
        foreach (DataGridViewCell cell in row.Cells)
            cell.Style.BackColor = cell.Value.ToString() == pattern ?
                Color.LightBlue : Color.Empty;
    dgv.ResumeLayout();
    //dgv.ClearSelection()
}

如果快速遍历整个 DGV;你可以称之为例如来自Textbox.TextChange 事件。

它在设置颜色时暂停布局,所以它应该快速且没有闪烁..

如果你只想在一列中搜索,你可以添加一个额外的条件,可能是这样的:

cell.Style.BackColor = cell.Value.ToString() == pattern &&  
                       cell.ColumnIndex == dgv.CurrentCell.ColumnIndex?

并将其放入 CellClick 事件中

【讨论】:

  • 是的,确实有一个错字,我想用相同的值绘制列的单元格(不是列的所有单元格),然后在另一列中选择一个单元格后,将单元格绘制为新建一个,并在上一列中返回默认样式。
  • 我用通用代码更新了答案,避免使用变量来跟踪最后标记的列。
猜你喜欢
  • 2013-04-12
  • 2016-05-27
  • 2015-07-11
  • 2014-10-08
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
相关资源
最近更新 更多