如何在动态添加行时使TableLayoutPanel的行高百分比一致?
TableLayoutPanel动态添加行后均分高度问题解决
我有一个设置了行自动调整(AutoResize)的TableLayoutPanel,它包含两列,支持运行时动态添加行。现在想实现添加行后,所有行的高度按相同百分比分配,但添加控件后用下面的代码实现时,顶部的grid极小,下一个grid几乎占满整个panel:
private void BindRawData(int rc) // row number is passed in { var percent = 100 - (tableLayoutPanel1.RowCount * 10); tableLayoutPanel2.Controls.Add(grid1, 1, rc); for(int i = 0; i < tableLayoutPanel2.RowStyles.Count - 1; i++) { var panel = tableLayoutPanel2.RowStyles[i]; panel.SizeType = SizeType.AutoSize; } }
解决方案
要实现所有行按相同百分比分配高度,需调整以下几点:
- 放弃使用
AutoSize作为行的尺寸类型,统一设置为SizeType.Percent - 每次添加新行后,计算每行应占的百分比:
100.0 / 总行数,为所有行的RowStyle应用该值 - 确保添加控件后,
RowStyles的数量与总行数匹配(避免因自动添加控件时未同步创建RowStyle导致的布局异常)
修正后的代码示例:
private void BindRawData(int rc) // rc为要添加的行索引 { // 将控件添加到指定列和行 tableLayoutPanel2.Controls.Add(grid1, 1, rc); // 同步RowStyles数量与总行数,确保每行都有对应的样式设置 while (tableLayoutPanel2.RowStyles.Count < tableLayoutPanel2.RowCount) { tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent)); } // 计算每行应分配的高度百分比 double equalPercent = 100.0 / tableLayoutPanel2.RowCount; // 遍历所有行,统一设置百分比高度 foreach (RowStyle style in tableLayoutPanel2.RowStyles) { style.SizeType = SizeType.Percent; style.Height = equalPercent; } // 强制触发布局刷新,确保设置立即生效 tableLayoutPanel2.PerformLayout(); }
原代码问题说明
你之前的代码存在两个核心问题:
- 错误地将行设置为
AutoSize,这会让行高仅适配控件内容,无法实现百分比均分 - 百分比计算逻辑(
100 - (tableLayoutPanel1.RowCount * 10))毫无依据,会导致行高分配比例混乱
改用统一的百分比尺寸类型并均分100%高度后,就能实现所有行等高的布局效果。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

