DataGridView单元格点击后列背景变色及默认样式恢复异常问题
解决DataGridView点击单元格高亮同列相同值后无法恢复默认样式的问题
嘿,我明白你遇到的困扰了——直接修改单元格的Style.BackColor会让它脱离全局默认样式的控制,再加上你改动了DefaultCellStyle和AlternatingRowsDefaultCellStyle的全局设置,这就导致切换单元格时没法轻松恢复原状。咱们来一步步修复这个问题:
问题根源分析
- 你当前的代码直接给匹配的单元格设置了
Style.BackColor,这个样式的优先级比全局的DefaultCellStyle更高,所以即使后续改回全局样式,这些被单独设置的单元格也不会跟着变化。 - 同时你直接覆盖了
AlternatingRowsDefaultCellStyle和DefaultCellStyle的背景色,没有保留原始样式,导致恢复时无法回到最初的状态。
解决方案步骤
1. 先保存原始的全局样式
在窗体初始化的时候,把DataGridView原本的默认样式和交替行样式保存下来,这样后续恢复时能精准回到初始状态:
// 定义类级变量存储原始样式 private Color _originalDefaultBackColor; private Color _originalAlternatingBackColor; // 在窗体Load事件中初始化这些变量 private void YourForm_Load(object sender, EventArgs e) { _originalDefaultBackColor = dgvLogHeader.DefaultCellStyle.BackColor; _originalAlternatingBackColor = dgvLogHeader.AlternatingRowsDefaultCellStyle.BackColor; }
2. 修改CellClick事件逻辑:先恢复,再高亮
每次点击单元格时,先把所有单元格的样式重置回原始状态,再高亮当前列中值匹配的单元格:
private void dgvLogHeader_CellClick(object sender, DataGridViewCellEventArgs e) { // 跳过表头和无效单元格 if (e.RowIndex < 0 || e.ColumnIndex < 0) return; // 第一步:完全恢复所有单元格到原始样式 // 恢复全局默认样式 dgvLogHeader.DefaultCellStyle.BackColor = _originalDefaultBackColor; dgvLogHeader.AlternatingRowsDefaultCellStyle.BackColor = _originalAlternatingBackColor; // 清除所有单元格的自定义背景色,让它们重新继承全局样式 foreach (DataGridViewRow row in dgvLogHeader.Rows) { foreach (DataGridViewCell cell in row.Cells) { cell.Style.BackColor = Color.Empty; } } // 第二步:获取当前点击单元格的信息 int targetColumn = e.ColumnIndex; string targetValue = dgvLogHeader.Rows[e.RowIndex].Cells[targetColumn].Value?.ToString(); if (string.IsNullOrEmpty(targetValue)) return; // 值为空则无需高亮 // 第三步:高亮当前列中值匹配的单元格 foreach (DataGridViewRow row in dgvLogHeader.Rows) { DataGridViewCell cell = row.Cells[targetColumn]; if (cell.Value?.ToString() == targetValue) { cell.Style.BackColor = Color.Brown; } } }
关键细节说明
- 使用
Color.Empty清除单元格的自定义背景色:这一步很重要,因为直接设置过Style.BackColor的单元格会优先使用这个值,清空后才会重新继承全局的默认样式。 - 保存原始样式而非硬编码恢复:这样无论你一开始给DGV设置了什么默认样式,都能精准恢复,而不是强制改成
SystemColors.Info这类固定颜色。 - 增加空值判断:避免单元格值为
null时调用ToString()抛出异常,让代码更健壮。
内容的提问来源于stack exchange,提问作者dMazay
相关产品推荐
相关产品推荐

