下面是一個完整的示例解決方案來演示我上面的建議。請注意,它全部在代碼中完成,並且只使用單個列,但可以與設計人員生成的控件(當然)以及多列一起使用。只要確保將所有控件連續設置(如標籤及其相應的輸入控件)設置爲Visible = false
即可使未使用的行正確合攏。
TableLayoutPanel tlp = new TableLayoutPanel();
tlp.RowStyles.Add(new RowStyle(SizeType.Absolute, 25));
tlp.RowStyles.Add(new RowStyle(SizeType.Absolute, 25));
tlp.RowStyles.Add(new RowStyle(SizeType.Absolute, 25));
tlp.RowStyles.Add(new RowStyle(SizeType.Absolute, 25));
tlp.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tlp.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tlp.RowStyles.Add(new RowStyle(SizeType.Absolute, 25));
TextBox b1 = new TextBox(); b1.Dock = DockStyle.Fill;
TextBox b2 = new TextBox(); b2.Dock = DockStyle.Fill;
TextBox b3 = new TextBox(); b3.Dock = DockStyle.Fill;
CheckBox special = new CheckBox(); special.Text = "Special?";
TextBox b4 = new TextBox(); b4.Dock = DockStyle.Fill; b4.Visible = false;
TextBox b5 = new TextBox(); b5.Dock = DockStyle.Fill; b5.Visible = false;
Button button = new Button(); button.Text = "Save";
special.CheckedChanged += new EventHandler((sender, args) => { b4.Visible = b5.Visible = special.Checked; });
tlp.Controls.Add(b1, 0, 0);
tlp.Controls.Add(b2, 0, 1);
tlp.Controls.Add(b3, 0, 2);
tlp.Controls.Add(special, 0, 3);
tlp.Controls.Add(b4, 0, 4);
tlp.Controls.Add(b5, 0, 5);
tlp.Controls.Add(button, 0, 6);
Controls.Add(tlp);
tlp.Dock = DockStyle.Fill;
tlp.BringToFront();
什麼是特定屬性返回類型(例如某種類型的枚舉類型?)和表單控件類型您用於默認項目屬性?使用TableLayoutPanel設計表單並將特殊字段的行設置爲AutoSize會很容易;那麼你可以將與每個特殊屬性相關的控件設置爲'Visible = false'。其他一切都會正常流動。 –
類似的東西...我打算有一個下拉式選擇類型和正確的額外字段將顯示。但Winforms他們增長了嗎? – codingbiz
是的。將行設置爲AutoSize的TableLayoutPanel使用將只使用盡可能多的空間。如果內容不可見,則表格下方的所有內容都會向上移動以填充空白區域;當顯示控件時,表格將在附加字段插入適當位置的情況下進行迴流。這很容易。 –