C# DataGridView设置重置单元格背景色 实现同列仅单个单元格高亮
DataGridView单列单单元格高亮实现方案
DataGridView的样式存在明确优先级:单元格Style > 行Style > 列DefaultCellStyle > 控件全局DefaultCellStyle。直接修改列DefaultCellStyle无法覆盖单元格单独设置的Style属性,必须针对单元格级别的样式做重置才能生效。
基础实现(逻辑直观,适合数据量小的场景)
直接在CellClick事件中先清空当前列所有单元格的自定义背景色,再给新选中的单元格设置高亮即可:
private void dataMenu_CellClick(object sender, DataGridViewCellEventArgs e) { // 过滤表头、新增空行的无效点击 if (e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex) { return; } // 重置当前点击列所有单元格的自定义背景色 foreach (DataGridViewRow row in dataMenu.Rows) { if (row.Index == dataMenu.NewRowIndex) continue; row.Cells[e.ColumnIndex].Style.BackColor = Color.Empty; } // 为当前点击单元格设置高亮色 dataMenu[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.CornflowerBlue; }
这里用Color.Empty给单元格背景色赋值,会让单元格自动回退继承上层(列/行/控件)的默认样式,不需要重新实例化完整的CellStyle对象,也不会覆盖单元格上已经设置的其他样式(比如字体、前景色、对齐方式等)。
性能优化实现(适合大数据量/虚拟模式场景)
如果表格数据量较大,每次点击遍历整列会有不必要的性能损耗,可以用字典单独记录每列当前高亮的行索引,只需要重置上一次高亮的单元格即可,不需要遍历全列:
// 类级别声明字典,key为列索引,value为该列当前高亮的行索引 private readonly Dictionary<int, int> _columnHighlightRowMapping = new Dictionary<int, int>(); private void dataMenu_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex) { return; } // 重置该列上一次高亮的单元格 if (_columnHighlightRowMapping.TryGetValue(e.ColumnIndex, out int lastHighlightRow)) { dataMenu[e.ColumnIndex, lastHighlightRow].Style.BackColor = Color.Empty; } // 设置新高亮单元格 dataMenu[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.CornflowerBlue; // 更新记录 _columnHighlightRowMapping[e.ColumnIndex] = e.RowIndex; }
注意:如果存在动态删除行的操作,需要同步处理字典里存储的行索引,避免索引越界。
内容的提问来源于stack exchange,提问作者Steven Lippert
相关产品推荐
相关产品推荐

