0

TableLayoutPanelにコントロールを動的に追加しています。

12行32列です。

列の幅を分割して、ラベルのあるものはTextBoxのあるものの2倍の幅になり、パーセンテージの合計は100になります。

labels = 5%
textBoxes = 2.5%

行ごとに24個のテキストボックスと行ごとに8個のラベルがあるため、これは100%(40%のラベル、60%のtextBox)に相当します。

ただし、ここに表示されているように、最後の列はスペースホッグです。

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

そして、ラベルが自分自身全体を表示するためのスペースが必要です。表示されているように、ラベルの幅は実際には4文字ではなく5文字( "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();
    }
}

アップデート

おそらく問題は、TLPの幅が32で正確に割り切れないことだと思いました(それは619でした)。それで640に広げましたが、同じ問題が残っています。

更新2

それを機能させるには、パーセンテージ*ではなく列の絶対サイズを使用し、ラベル保持列の幅を35に増やす必要がありました(TLP幅640のtextBox保持列には15だけが残ります) 。

  • WPFは時々クマになることがありますが(ウィニーよりもコディアックのように)、解像度や画面サイズが異なる場合など、絶対サイズがすべてダラスに行くことを心配するこのような状況では、確実に請求が満たされます。
4

2 に答える 2

1

レイアウトパネルの合計幅がレイアウトパネルの列数で完全に割り切れない場合(相対的な%幅を使用する場合)、最後の列の幅は常にスペースの残りを埋めるために埋め込まれます。

各テキストボックスに1文字だけを含める必要があると仮定すると、次の列幅設定を使用した600x240のレイアウトパネルサイズは非常にうまく表示されます。

labels = 6.5%
textBoxes = 2.0%
于 2012-08-17T19:56:17.237 に答える
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 に答える