如何实现DataGridView行高自动换行调整并动态显示水平滚动条?
WinForm DataGridView自适应显示异常问题说明
问题场景
- 初始界面截图

- 按钮点击绑定数据代码
private void button1_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("Column 1"); dt.Columns.Add("Column 2"); dt.Columns.Add("Column 3"); dt.Columns.Add("Column 4"); dt.Columns.Add("Column 5"); DataRow dr = dt.NewRow(); dr["Column 1"] = "Col1 Test"; dr["Column 2"] = "Col2 Test"; dr["Column 3"] = "Col3 Test"; dr["Column 4"] = "Col4 Test"; dr["Column 5"] = "Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test Col5 Test "; dt.Rows.Add(dr); dataGridView1.DataSource = dt; dataGridView1.Columns["Column 5"].DefaultCellStyle.WrapMode = DataGridViewTriState.True; dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders; dataGridView1.Columns["Column 5"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; }
- 正常运行效果截图

异常表现
在Visual Studio设计器中缩小DataGridView尺寸后重启应用,水平滚动条不显示,内容被挤压:
- 异常设计界面截图

- 异常运行效果截图

需求
实现DataGridView满足以下效果:
- 行列内容自动换行
- 自适应尺寸避免内容挤压
- 动态调整行高
- 自动显示水平滚动条
解决方案
原有代码的问题在于DataGridViewAutoSizeColumnMode.Fill模式会强制列填充控件剩余宽度,没有最小宽度限制的情况下会无限制压缩其他列,导致水平滚动条无法触发,按照以下步骤调整即可:
步骤1:配置全局基础属性
在窗体初始化或Form_Load事件中添加全局配置:
// 开启水平+垂直滚动条 dataGridView1.ScrollBars = ScrollBars.Both; // 列头开启换行适配 dataGridView1.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True;
步骤2:修改列自适应规则
给所有列设置最小宽度阈值,避免被无限压缩,修改绑定数据后的逻辑:
dataGridView1.DataSource = dt; // 前4列按内容自适应宽度,同时设置最小宽度避免被压缩 for (int i = 0; i < 4; i++) { dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; // 最小宽度可根据业务需求调整 dataGridView1.Columns[i].MinimumWidth = 80; } // 第5列配置 dataGridView1.Columns["Column 5"].DefaultCellStyle.WrapMode = DataGridViewTriState.True; dataGridView1.Columns["Column 5"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; // 给第5列也设置最小宽度,低于该宽度就会触发水平滚动条 dataGridView1.Columns["Column 5"].MinimumWidth = 200; // 行高随内容自动调整 dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
步骤3:可选:运行时尺寸变化适配
如果需要在运行时拖动修改窗体/控件大小时也能正常适配,添加DataGridView的Resize事件处理:
private void dataGridView1_Resize(object sender, EventArgs e) { // 强制刷新列宽计算逻辑 dataGridView1.PerformLayout(); }
实现原理
- 每列设置
MinimumWidth后,当DataGridView总宽度小于所有列最小宽度之和时,会自动触发水平滚动条 Fill模式的列只会填充控件减去其他列宽度后的剩余空间,不会压缩其他列到最小宽度以下- 开启
WrapMode和AutoSizeRowsMode后,行高会根据内容自动撑开,不会截断纵向内容
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

