运行时高效高亮DataGridView首列复选框勾选行的方法求助
正确实现DataGridView高亮勾选行的高效方案
原代码问题说明
你原来的代码逻辑完全错误:
SelectedColumns(0)是获取选中的列集合里的第一列,不是行集合,无法用来遍历行;Equals("Column1 = true")的写法不符合语法,根本达不到行过滤的效果。
高效实现方法
针对3000行的场景,推荐两种高效方案,根据你的DataGridView是否绑定数据源选择:
方案1:绑定DataTable时(推荐,性能最优)
直接在数据源层面筛选符合条件的行,再对应到UI行设置样式:
' 假设你的DataGridView绑定的是DataTable Dim dataTable As DataTable = DirectCast(myDataGrid.DataSource, DataTable) ' 筛选Column1值为True的行 Dim filteredRows As DataRow() = dataTable.Select("Column1 = True") ' 先关闭DataGridView绘制,避免频繁刷新 myDataGrid.SuspendLayout() ' 重置所有行的背景色(如果需要清除之前的高亮) For Each row As DataGridViewRow In myDataGrid.Rows If Not row.IsNewRow Then row.DefaultCellStyle.BackColor = myDataGrid.DefaultCellStyle.BackColor End If Next ' 给筛选出的行设置高亮 For Each dataRow As DataRow In filteredRows ' 找到对应UI行的索引 Dim rowView As DataRowView = dataTable.DefaultView(dataTable.Rows.IndexOf(dataRow)) Dim rowIndex As Integer = myDataGrid.Rows.Cast(Of DataGridViewRow)().FirstOrDefault(Function(r) r.DataBoundItem Is rowView)?.Index If rowIndex >= 0 Then myDataGrid.Rows(rowIndex).DefaultCellStyle.BackColor = Color.LightGreen End If Next ' 恢复绘制 myDataGrid.ResumeLayout()
方案2:未绑定数据源时
通过优化UI绘制逻辑,减少遍历耗时:
' 关闭DataGridView的布局和绘制,避免每设置一行就刷新UI myDataGrid.SuspendLayout() ' 重置所有行背景色(可选) For Each row As DataGridViewRow In myDataGrid.Rows If Not row.IsNewRow Then row.DefaultCellStyle.BackColor = myDataGrid.DefaultCellStyle.BackColor End If Next ' 只遍历并处理勾选的行 For Each row As DataGridViewRow In myDataGrid.Rows If Not row.IsNewRow Then ' 检查首列(Column1)的复选框是否勾选 If CBool(row.Cells("Column1").Value) Then row.DefaultCellStyle.BackColor = Color.LightGreen End If End If Next ' 恢复绘制和布局 myDataGrid.ResumeLayout()
性能说明
- 两种方案都使用了
SuspendLayout()和ResumeLayout(),这能避免设置每行样式时频繁刷新UI,大幅提升3000行场景下的处理速度; - 绑定数据源的方案在筛选时直接操作DataTable,比遍历UI行更高效,优先推荐。
内容的提问来源于stack exchange,提问作者Roberto Rossi
相关产品推荐
相关产品推荐

