-->

为什么我的TableLayoutPanel中使用所有其规模时按百分比划分?(Why doesn

2019-10-30 03:20发布

我动态将控件添加到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(我已经设置在设计时列宽的百分比,通过属性页列集合)

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();
    }
}

UPDATE

我想也许问题是TLP的宽度是不完全整除32(它是619); 所以我把它扩大到了640,但同样的问题依然存在。

更新2

为了得到它的工作,我不得不使用绝对尺寸列,而不是百分比*,并增加标签保持柱的宽度35(其中在640 TLP宽度只剩15对TextBox,保持柱) 。

  • WPF有时可以是(更像是一个比科迪亚克小熊)熊,但它肯定充满法案这样的情况,在这里我担心绝对大小都去达拉斯不同分辨率/屏幕尺寸等

Answer 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 = 144宽度为24个窄列

8 * 12 = 96宽度为8个宽列

240共有。

11遗留下来的,所以额外的进入到最后一列,哪些人会认为这将是(6)+额外的(11),它最终被,比如说,3倍一样宽,你所期望的,因为它最终被以浮点运算。

总之,这就是我为什么它看起来是这样的猜测。



Answer 2:

最后一列的宽度总是填充以填充该空间的其余部分如果布局面板的总宽度是不通过(使用相对%宽度时)在布局面板的列数完全除尽。

假设每个文本框仅需要包含一个字符,用以下的柱宽度设置显示器相当不错的600x240布局面板尺寸。

labels = 6.5%
textBoxes = 2.0%


文章来源: Why doesn't my TableLayoutPanel use all of its size when divided by percentages?