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