2013-04-30 91 views
1

我有一個自定義的用戶控件,它做我的應用程序的工作。WIndows表格動態佈局

我需要在我的表單上有一個可變數目的我的usercontrols,這個數字在運行時是已知的。

我希望每個人都是完整的客戶端寬度,並且所有的控件填充窗口,大小相等。如果有兩個,那麼每個客戶端的高度是客戶端高度的一半 - 如果是三個,則每個客戶端高度的三分之一。

當主窗口調整大小時,佈局應調整大小。我不希望用戶能夠調整控件的大小,而不是通過調整主窗口的大小(所以拆分容器不可用)

我試圖使用TableLayoutPanel來做到這一點,但是當我設置GrowStyle屬性添加到TableLayoutPanelGrowStyle.AddRows,並添加我的控件,行數不會改變。

當然這種佈局方案並不難實現?我似乎無法弄清楚?

謝謝

回答

2

它的佈局很容易計算,所以很難讓TLP得到回報。哪一個控件在設計器中運行得非常好,但是當您的控件數量不可預知時,它非常尷尬。

這將正常工作爲好,少了很多的代碼和一個較少的控制,以減緩你的UI下來:

protected override void OnResize(EventArgs e) { 
     for (int ix = 0; ix < Controls.Count; ++ix) { 
      int y1 = this.ClientSize.Height * ix/Controls.Count; 
      int y2 = this.ClientSize.Height * (ix + 1)/Controls.Count; 
      Controls[ix].Bounds = new Rectangle(0, y1, this.ClientSize.Width, y2-y1); 
     } 
     base.OnResize(e); 
    } 
    protected override void OnLoad(EventArgs e) { 
     OnResize(e); 
     base.OnLoad(e); 
    } 
+0

自發布這個問題以來,我得出了類似的結論。我的佈局並不複雜,自定義代碼並不困難。儘管我真的很驚訝,因爲雖然我以前從來沒有理由使用TableLayoutPanel,但我的印象是這種事情確實如此 - 但似乎並非如此。 – slippyr4 2013-05-01 08:10:14

0

是的,你可以使用表佈局面板。因爲每一行的高度和寬度應該等於所有行的百分比。那麼它會工作。

0

這裏是使用按鈕來填充配置有1個小區和Row.SizeType =百分比的TableLayoutPanel中的每一個小區的小例子:

private int buttonCount = 0; 

void button1_Click(object sender, EventArgs e) { 
    Button b = new Button() { Text = "Button #" + (++buttonCount).ToString() }; 
    b.Dock = DockStyle.Fill; 

    if (buttonCount == 1) { 
    tlp.Controls.Add(b, 0, 0); 
    } else { 
    tlp.RowStyles.Add(new RowStyle() { SizeType = SizeType.Percent }); 
    tlp.Controls.Add(b, 0, tlp.RowCount); 
    tlp.RowCount++; 
    } 

    Single percHeight = ((Single)1/(Single)tlp.RowStyles.Count) * 100; 

    foreach (RowStyle rs in tlp.RowStyles) { 
    rs.Height = percHeight; 
    } 
} 

每次添加一個按鈕(或一個用戶控件)你重新計算每一行的百分比高度。

+0

感謝您的例子。我想出了類似的東西,但我並不滿意它 - 看起來沒有比實現手動佈局代碼更簡單的方法。 – slippyr4 2013-05-01 08:08:24