0

我正在向 TableLayoutPanel 动态添加控件。

它有 12 行和 32 列。

我已经划分了列的宽度,这样带有标签的宽度是带有文本框的宽度的两倍,并且百分比加起来为 100:

labels = 5%
textBoxes = 2.5%

由于每行有 24 个文本框,每行有 8 个标签,这等于 100%(40% 标签,60% 文本框)。

但是,最后一列是太空猪,如下所示:

http://warbler.posterous.com/the-32-column-is-wider-than-the-rest

而且我需要标签的空间来展示它们的整个自我:它们实际上是五个字符宽(“00:00”...“23:45”),而不是显示的四个字符。

根据经验证据(以前的反复试验),我可以减小 TLP 的宽度以缩小最后一列,但这并不能解决我的标签单元太窄的问题。

这就是我在 TLP 上打控件的方式(我在设计时通过 Columns 集合的属性页面设置了列宽百分比)

private void AddPlatypusScheduleControlsToTableLayoutPanel()
{
    try
    {
        this.SuspendLayout();
        tableLayoutPanelPlatypusSchedule.ColumnCount = PLATYPUS_SCHEDULE_COL_COUNT;
        int ColNum = 0;
        int RowNum = 0;
        int LoopCounter = 1;
        var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);

        while (LoopCounter <= QUARTER_HOUR_COUNT)
        {
            string lblName = string.Format("labelPS{0}", LoopCounter);
            var lbl = new Label
                {
                    Name = lblName,
                    Dock = DockStyle.Fill,
                    Margin = new Padding(),
                    Font = new Font("Microsoft Sans Serif", 7),
                    TextAlign = ContentAlignment.MiddleCenter,
                    Text = dt.ToString("HH:mm")
                };
            tableLayoutPanelPlatypusSchedule.Controls.Add(lbl, ColNum, RowNum);

            string txtbxName1 = string.Format("textBoxLSA{0}", LoopCounter);
            var txtbxa = new TextBox { Name = txtbxName1, Dock = DockStyle.Fill, Margin = new Padding() };
            string txtbxName2 = string.Format("textBoxLSB{0}", LoopCounter);
            var txtbxb = new TextBox { Name = txtbxName2, Dock = DockStyle.Fill, Margin = new Padding() };
            string txtbxName3 = string.Format("textBoxLSC{0}", LoopCounter);
            var txtbxc = new TextBox { Name = txtbxName3, Dock = DockStyle.Fill, Margin = new Padding() };
            tableLayoutPanelPlatypusSchedule.Controls.Add(txtbxa, ColNum + 1, RowNum);
            tableLayoutPanelPlatypusSchedule.Controls.Add(txtbxb, ColNum + 2, RowNum);
            tableLayoutPanelPlatypusSchedule.Controls.Add(txtbxc, ColNum + 3, RowNum);

            dt = dt.AddMinutes(15);
            RowNum++;
            LoopCounter++;
            if (RowNum == 12)
            {
                ColNum = ColNum + 4;
                RowNum = 0;
            }
        }
    }
    finally {
        this.ResumeLayout();
    }
}

更新

我想问题可能是 TLP 的宽度不能被 32 整除(它是 619);所以我把它扩大到640,但同样的问题仍然存在。

更新 2

为了让它工作,我不得不对列使用绝对大小而不是百分比*,并将标签保持列的宽度增加到 35(在 TLP 宽度为 640 时,只有 15 个用于保持文本框的列) .

  • WPF 有时可能是一只熊(更像是 Kodiak 而不是 Winnie),但它确实满足了这种情况的需求,我担心绝对尺寸会在不同的分辨率/屏幕尺寸等下全部转移到达拉斯。
4

2 回答 2

1

所以这可能是由于浮点数学和整数宽度。

控件的ClientSize.Width是整数。表格布局,无论您是否指定浮点值,最终都需要将其转换为整数。

我整理了一个与您类似的示例。当我运行示例时,我获取了控件的ClientWidth值,我的窗口大小为 284。

单元格边框会有一定的宽度,我猜我说它们是 1。所以,让我们假设 284 减去边框的 33,所以剩下的 251 需要分成 32 列。

对于那些窄列,值为 0.025:

0.025 * 251 = 6.275, truncated to 6

所以每个窄列都有一个额外的 0.275。

对于那些较宽的列,该值为 0.05:

0.05 * 251 = 12.55, truncated to 12

所以每个宽列有一个额外的 0.55。

24 * 6 = 24 窄列的 144 宽度

8 * 12 = 8 宽列的 96 宽

总计 240 个。

剩下 11 个,所以额外的到最后一列,它最终是人们认为的 (6) + 额外的 (11),它最终是你期望的 3 倍宽,由于到浮点数学。

无论如何,这就是我对它为什么看起来那样的猜测。

于 2012-08-17T20:24:22.140 回答
1

如果布局面板的总宽度不能完全被布局面板中的列数整除(使用相对百分比宽度时),则始终填充最后一列的宽度以填充剩余空间。

假设每个文本框只需要包含一个字符,使用以下列宽设置的 600x240 布局面板大小显示得非常好。

labels = 6.5%
textBoxes = 2.0%
于 2012-08-17T19:56:17.237 回答