[英]TableLayoutPanel sizing
我可能沒有使用正確的控件來滿足我的需求。 我正在填充一個帶控件的表,我希望每列自動調整其中包含的控件的大小。 例如,一列文本框將比一列復選框寬。 由於不同操作系統的復雜性,不同的DPI,不同的字體等,我不想擺弄測量是否可以幫助它。桌子可以水平擴展以適應控件,帶有滾動條。 如何通過TableLayoutPanel或其他控件實現這一點?
謝謝。
編輯添加代碼:
private void UpdateLocations()
{
tableLayoutPanel1.RowCount = CurrentSchedule.location.Length + 1;
tableLayoutPanel1.ColumnCount = 7;
int row = 1;
int timeWidth = TextRenderer.MeasureText("00:00:00x", tableLayoutPanel1.Font).Width;
Label lab = new Label();
lab.Text = "Location";
tableLayoutPanel1.Controls.Add(lab, 0, 0);
lab = new Label();
lab.Text = "Arrive";
tableLayoutPanel1.Controls.Add(lab, 1, 0);
lab = new Label();
lab.Text = "Depart";
tableLayoutPanel1.Controls.Add(lab, 2, 0);
lab = new Label();
lab.Text = "Pass?";
tableLayoutPanel1.Controls.Add(lab, 3, 0);
lab = new Label();
lab.Text = "Path";
tableLayoutPanel1.Controls.Add(lab, 4, 0);
lab = new Label();
lab.Text = "Plat";
tableLayoutPanel1.Controls.Add(lab, 5, 0);
lab = new Label();
lab.Text = "Line";
tableLayoutPanel1.Controls.Add(lab, 6, 0);
foreach (location loc in CurrentSchedule.location)
{
TextBox tb = new TextBox();
tb.Text = loc.locationID;
tableLayoutPanel1.Controls.Add(tb, 0, row);
tb = new TextBox();
tb.Text = loc.arrivalTime;
tb.Width = timeWidth;
tableLayoutPanel1.Controls.Add(tb, 1, row);
tb = new TextBox();
tb.Text = loc.departureTime;
tb.Width = timeWidth;
tableLayoutPanel1.Controls.Add(tb, 2, row);
CheckBox cb = new CheckBox();
cb.Checked = loc.passingTime;
tableLayoutPanel1.Controls.Add(cb, 3, row);
tb = new TextBox();
tb.Text = loc.pathCode;
tableLayoutPanel1.Controls.Add(tb, 4, row);
tb = new TextBox();
tb.Text = loc.platformCode;
tableLayoutPanel1.Controls.Add(tb, 5, row);
tb = new TextBox();
tb.Text = loc.lineCode;
tableLayoutPanel1.Controls.Add(tb, 6, row);
row++;
}
/*for (int idx = 0; idx < tableLayoutPanel1.RowCount; idx++)
{
tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize;
}
for (int idx = 0; idx < tableLayoutPanel1.ColumnCount; idx++)
{
tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize;
}*/
}
(是的,它需要大量的重構 - 我只是想讓它先工作)
注釋掉的位會導致超出范圍的異常,即使邏輯上(對我來說)也不應該。 范圍似乎限於我在設計時設置的任何內容,而不是在運行時。
抱歉,將列設置為自動調整大小有什么問題? 這就是TableLayoutPanel的作用,將列大小調整到適合其中的控件。 擴展表並有一個滾動條需要您將表Autosize屬性設置為true,然后將TableLayoutPanel放在另一個啟用了滾動條的面板中。 但是除非我誤解了你的要求,否則列的大小應該是開箱即用的。
為了確保,您將轉到columns屬性並將每個列的SizeType設置為AutoSize對嗎? 不只是表本身的AutoSize屬性?
這是你想要的嗎?
- 郵編:
謝謝你的代碼。 我建議你使用設計師做很多事情。 至少要設置列,將它們設置為自動調整大小,然后添加標題標簽。
您還可能需要簽出Datagrid控件並將其綁定到您的位置列表。
要使此方法有效:
1)您的列看起來大小相同的原因是因為您使用的標題標簽不是自動調整大小。 它們都是x像素寬,並且正在拉伸列。 做這個:
Label lab = new Label();
lab.AutoSize = true;
lab.Text = "Location";
tableLayoutPanel1.Controls.Add(lab, 0, 0);
您還需要在CheckBox控件和您添加為內容的任何其他標簽上將AutoSize屬性設置為true。
2)設置RowCount和ColumnCount不會影響RowStyles或ColumnStyles集合。 你有7個列但只有2個ColumnStyles。 嘗試:
tableLayoutPanel1.ColumnStyles.Clear();
for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++)
{
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
}
tableLayoutPanel1.RowStyles.Clear();
for (int i = 0; i < tableLayoutPanel1.RowCount; i++)
{
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
}
唯一需要注意的是,某些控件在行中會不對齊(例如標簽顯得太高)。 要解決這個問題,請設置Margin屬性,通常為3,6,3,0,以便將它們與文本框和復選框等對齊。
您需要處理ControlAdded事件,如果新控件的寬度大於列的寬度,則調整列的大小...
你說你不想擺弄測量,但是如果你正在調整大小,你就必須這樣做。 如果您對復選框的TextAlign等小心,那么字體等不應該進入它...
您可以在另一個面板中使用多個splitContainers 。 但是不要使用很多嵌套面板,你可能會得到像這樣的調整大小/重繪問題。
如果要使用SplitContainer,可以找到許多示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.