DataGridView 更改单元格背景并恢复默认样式

问题描述 投票:0回答:1

在我的 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;
            }
        }

但是之后单元格背景发生了变化,默认样式也丢失了。

c# datagridview styles
1个回答
2
投票

这是一种方法:

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.ColumnIndex
e.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
事件

© www.soinside.com 2019 - 2024. All rights reserved.