You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在动态添加行时使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();
}

原代码问题说明

你之前的代码存在两个核心问题:

  1. 错误地将行设置为AutoSize,这会让行高仅适配控件内容,无法实现百分比均分
  2. 百分比计算逻辑(100 - (tableLayoutPanel1.RowCount * 10))毫无依据,会导致行高分配比例混乱

改用统一的百分比尺寸类型并均分100%高度后,就能实现所有行等高的布局效果。


内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:30:50