编程隐藏DataGridView多列性能缓慢的问题求助
高效控制DataGridView列显隐的实现与优化
针对你提到的场景——一个包含300列、80行的DataGridView,列分为3种类型,通过3个对应复选框控制列的显示/隐藏,我先把你给出的HideColumns方法片段整理完善,并补充一些关键优化细节:
private void HideColumns(DataGridView datagridview) { if (datagridview.DataSource == null) return; var watch = Stopwatch.StartNew(); // 暂停所有父控件的布局,避免频繁刷新导致卡顿 Control parentControl = datagridview; while (parentControl != this) { parentControl.SuspendLayout(); parentControl = parentControl.Parent; } this.SuspendLayout(); // 处理数据绑定的暂停(如果使用CurrencyManager) CurrencyManager currencyManager = (CurrencyManager)BindingContext[datagridview.DataSource]; currencyManager.SuspendBinding(); // 核心:根据列类型和复选框状态设置显隐 foreach (DataGridViewColumn column in datagridview.Columns) { // 假设列的Tag属性存储了对应的类型标识(比如自定义枚举ColumnType) if (column.Tag is ColumnType columnType) { column.Visible = columnType switch { ColumnType.Type1 => checkBoxType1.Checked, ColumnType.Type2 => checkBoxType2.Checked, ColumnType.Type3 => checkBoxType3.Checked, _ => true // 默认显示未知类型的列 }; } } // 恢复数据绑定和布局 currencyManager.ResumeBinding(); this.ResumeLayout(); parentControl = datagridview; while (parentControl != this) { parentControl.ResumeLayout(); parentControl = parentControl.Parent; } watch.Stop(); Debug.WriteLine($"列显隐操作耗时:{watch.ElapsedMilliseconds}ms"); } // 自定义枚举,统一管理列类型 public enum ColumnType { Type1, Type2, Type3 }
关键优化说明
- 暂停布局刷新:你代码里的
SuspendLayout逻辑非常关键,操作300列这种大量控件时,每修改一列的Visible属性都会触发UI布局,暂停父控件布局能大幅减少卡顿,一定要记得配对调用ResumeLayout。 - 数据绑定控制:通过
CurrencyManager暂停/恢复绑定,避免列显隐过程中触发不必要的数据刷新,进一步提升性能。 - 列类型标识:用
Tag+枚举的方式标记列类型,比硬编码列名或列索引更易维护,后续新增列类型只需扩展枚举即可。 - 性能监控:保留
Stopwatch的代码,方便你实际测试操作耗时,排查潜在瓶颈。
内容的提问来源于stack exchange,提问作者ehh
相关产品推荐
相关产品推荐

