数据网格视图更改单元格背景并恢复默认样式



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

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

这是一种方法:

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

相关内容

最新更新