DataGridView选中单元格时整行着色异常问题排查及需求实现
DataGridView 整行着色问题修复方案
原代码存在的问题
- 初始化逻辑错误:程序启动时
CellStateChanged事件会对每个单元格触发,错误的状态判断导致所有行被默认染成粉色。 - 多选后单选失效:当一行存在多个选中单元格时,取消其中一个单元格会触发事件将整行设为白色,忽略了该行其他仍处于选中状态的单元格,导致着色失效。
修复后的代码
private void DataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) { var dataGrid = (DataGridView)sender; // 跳过表头行 if (e.Cell.RowIndex < 0) return; DataGridViewRow row = dataGrid.Rows[e.Cell.RowIndex]; // 判断当前行是否存在任意选中的单元格 bool hasSelectedCell = row.Cells.Cast<DataGridViewCell>().Any(cell => cell.Selected); row.DefaultCellStyle.BackColor = hasSelectedCell ? Color.Pink : Color.White; }
补充初始化处理
在窗体加载事件中手动初始化所有行背景色,避免启动时的异常着色:
private void Form1_Load(object sender, EventArgs e) { foreach (DataGridViewRow row in DataGridView1.Rows) { if (row.Index >= 0) // 跳过表头行 { row.DefaultCellStyle.BackColor = Color.White; } } }
修复原理
- 不再仅依赖当前触发事件的单个单元格状态,而是遍历整行所有单元格判断选中状态,只要行内有任意单元格选中,就保持整行粉色。
- 初始化阶段手动统一设置行背景色,规避事件初始化触发时的错误着色逻辑。
内容的提问来源于stack exchange,提问作者Caio Souza
相关产品推荐
相关产品推荐

