DataGridView行高自动适配异常:ComboBox列内容被截断
我之前也踩过DataGridViewComboBoxColumn行高不自动适配的坑,太懂这种看着内容被截断的烦躁了!其实核心原因是:TextBox列的单元格会自动计算文本高度来触发行高调整,但ComboBox列的默认绘制逻辑根本没做这步。下面给你几个实用的解决办法,从临时修复到彻底根治都有:
解决DataGridViewComboBox列行高无法自动适配的问题
方法1:手动触发行高计算(适合单列/少量场景)
当ComboBox列的内容更新后,你可以遍历所有行,手动计算每个单元格的文本高度,再调整对应行的高度。示例代码如下:
// 假设你的DataGridView名为dataGridView1,目标ComboBox列索引为0 foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.Cells[0].Value != null) { // 获取单元格显示的文本(注意要取显示文本而非值成员) string cellText = row.Cells[0].FormattedValue.ToString(); // 用DataGridView的字体计算文本实际高度 Size textSize = TextRenderer.MeasureText(cellText, dataGridView1.Font); // 预留4px边距避免内容贴边,同时保留原有行高的最大值 row.Height = Math.Max(row.Height, textSize.Height + 4); } }
提示:如果是绑定数据源的ComboBox列,一定要确保你取到的是显示文本字段,而不是值成员,不然计算出来的高度会完全不对。
方法2:自定义ComboBox单元格(彻底根治)
如果需要长期解决这个问题,最好自定义一个ComboBox单元格类,让它和TextBox列一样自动触发行高计算。步骤很简单:
- 创建自定义单元格类:
public class AutoSizeComboBoxCell : DataGridViewComboBoxCell { protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { // 先调用基类完成基础绘制 base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts); // 计算文本高度并自动调整行高 if (formattedValue != null) { Size textSize = TextRenderer.MeasureText(formattedValue.ToString(), cellStyle.Font); if (OwningRow.Height < textSize.Height + 4) { OwningRow.Height = textSize.Height + 4; } } } }
- 创建对应的列类:
public class AutoSizeComboBoxColumn : DataGridViewComboBoxColumn { public AutoSizeComboBoxColumn() { CellTemplate = new AutoSizeComboBoxCell(); } }
- 替换原有列:
- 设计器中添加的列:直接把列的类型修改为
AutoSizeComboBoxColumn; - 代码创建的列:用这个自定义列类代替
DataGridViewComboBoxColumn即可。
- 设计器中添加的列:直接把列的类型修改为
方法3:简单配置适配换行文本
如果你的ComboBox内容是需要换行的文本,可以先开启DataGridView的自动行高:
- 设置
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; - 再把ComboBox列的
DefaultCellStyle.WrapMode = DataGridViewTriState.True;
不过这个方法只对多行文本有效,单行长文本还是需要配合前面的方法使用。
补充一下:为什么TextBox列正常?因为DataGridViewTextBoxCell在绘制时会自动计算文本高度,并通知DataGridView调整行高,但ComboBoxCell默认没有实现这个逻辑,所以需要我们手动补全。
内容的提问来源于stack exchange,提问作者Whirlwind
相关产品推荐
相关产品推荐

