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

时间:2018-05-25 12:47:12

标签: c# datagridview styles

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

h1.h{
    font-size:2.5 rem;
    font-style:italic;
    color : wheat;
 }

但在此之后,单元格已更改背景并且默认样式丢失。

1 个答案:

答案 0 :(得分:0)

这是一种方法:

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事件