C# 解决DataGridView列AutoSizeMode模式初始加载显示异常问题
C# DataGridView首次绑定数据列显示异常问题修复方案
问题根因
首次绑定数据时DataGridView控件尚未完成窗体布局初始化,列宽计算依赖的控件尺寸为设计时预设值,而非运行时最终尺寸,导致列宽计算错误,部分列被挤压隐藏;搜索重新绑定时控件已完成渲染,尺寸参数正确,因此显示正常。
修复步骤
1. 调整绑定时机
将首次数据绑定逻辑从Form_Load或构造函数移至Form_Shown事件,保证绑定操作在控件布局完成后执行。
2. 显式定义列规则
禁用自动生成列,提前固定列配置,避免自动生成的列属性不符合预期,同时配置列宽填充模式保证无滚动条:
- 关闭自动列生成:
AutoGenerateColumns = false - 禁用滚动条:
ScrollBars = ScrollBars.None - 列宽采用填充模式:
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill,通过FillWeight属性为不同列分配宽度占比
3. 绑定前后控制布局更新
绑定数据前暂停控件布局,绑定完成后强制刷新列宽计算,避免绑定过程中多次重绘导致的计算异常。
参考代码
private void Form1_Load(object sender, EventArgs e) { // 初始化阶段提前配置列规则,仅执行一次 dgvMain.AutoGenerateColumns = false; dgvMain.ScrollBars = ScrollBars.None; dgvMain.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 自定义列,DataPropertyName对应SQL查询返回的字段名 dgvMain.Columns.Add(new DataGridViewTextBoxColumn { Name = "Id", HeaderText = "编号", DataPropertyName = "Id", FillWeight = 15 }); dgvMain.Columns.Add(new DataGridViewTextBoxColumn { Name = "Description", HeaderText = "描述", DataPropertyName = "Description", FillWeight = 60 }); // 其余列按需求添加... } private void Form1_Shown(object sender, EventArgs e) { // 首次绑定放在Shown事件,保证控件已完成布局 LoadGridData(); } // 数据加载方法,首次加载、搜索操作复用 private void LoadGridData(string searchFilter = "") { dgvMain.SuspendLayout(); // 此处替换为你的SQL Server数据读取逻辑 DataTable data = QueryDataFromSql(searchFilter); dgvMain.DataSource = data; dgvMain.ResumeLayout(); // 强制重新计算列宽 dgvMain.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); // 恢复填充模式保证列宽撑满控件无滚动条 dgvMain.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; }
补充说明
如果窗体支持尺寸调整,可在Form_SizeChanged事件中调用dgvMain.AutoResizeColumns()方法,保证窗体尺寸变化时列宽自动适配,不会出现滚动条。
内容的提问来源于stack exchange,提问作者hot spot
相关产品推荐
相关产品推荐

