2010-02-02 98 views
5

我正在使用TableLayoutPanel將客戶區分割成3行(只有1列)。頂部和底部的行被設計成具有固定的高度;它們將包含一個頁眉和一個頁腳,最初每個頁面都包含一個包含靜態文本的子標籤控件(僅用於開始)。中間行應該動態調整大小以填充剩餘區域。這個中間窗格最終將包含一個列表視圖。我有一個管理器類,它作爲一個參數被管理的面板(ExplorerTableLayoutPanel)對象:TableLayoutPanel:無法正確獲取內容行的大小

public class ExplorerTableLayoutPanelManager 
{  
    public ExplorerTableLayoutPanelManager(ExplorerTableLayoutPanel panel) 
    { 
     LayoutPanel = panel; 
    } 

有3個方法是,在表的佈局創建各3列:

private void AddHeaderRow() 
    { 
     const int headerHeight = 30; 
     LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, headerHeight)); 

     Label label = new Label(); 
     label.BackColor = Color.AliceBlue; 
     label.BorderStyle = BorderStyle.None; 
     label.ForeColor = Color.LightGray; 
     label.TextAlign = ContentAlignment.MiddleRight; 
     label.Text = "Header Banner"; 
     label.Dock = DockStyle.Fill; 
     float size = label.Font.SizeInPoints; 
     label.Font = new Font(label.Font.Name, size * 2); 

     const int column = 0, row = 0; 
     LayoutPanel.Controls.Add(label, column, row); 
    } 


    private void AddBodyRow() 
    { 
     LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 

     Label label = new Label(); 
     label.BorderStyle = BorderStyle.FixedSingle; 
     label.ForeColor = Color.LightGray; 
     label.TextAlign = ContentAlignment.MiddleCenter; 
     label.Text = "Content Under construction ..."; 
     label.Dock = DockStyle.Fill; 

     float size = label.Font.SizeInPoints; 
     label.Font = new Font(label.Font.Name, size * 2); 

     const int column = 0, row = 1; 
     LayoutPanel.Controls.Add(label, column, row); 
    } 


    private void AddFooterRoow() 
    { 
     const int footerHeight = 30; 
     LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, footerHeight)); 

     Label label = new Label(); 
     label.BackColor = Color.AliceBlue; 
     label.BorderStyle = BorderStyle.None; 
     label.ForeColor = Color.LightGray; 
     label.TextAlign = ContentAlignment.MiddleRight; 
     label.Text = "Footer Banner"; 
     label.Dock = DockStyle.Fill; 

     float size = label.Font.SizeInPoints; 
     label.Font = new Font(label.Font.Name, size * 2); 

     const int column = 0, row = 2; 
     LayoutPanel.Controls.Add(label, column, row); 
    } 

的我所看到的問題是最後一行佔據了我所要求的固定行高度30.這部分是正確的。然而,第一排和第二排在他們之間平分剩餘的空間,這不是我想要的。正如你所看到的,我已經明確地將第一行的行高設置爲30,其方式與最後一行完全相同,但這似乎不起作用。第二行(中)的RowStyle大小設置爲SizeType.AutoSize,我的意思是用盡剩餘空間,所以不要明確設置大小。我可能是錯的,但我不確定。

+0

它接縫要模擬「碼頭」佈局屬性與表。 – 2015-12-15 08:34:14

回答

11

我沒有測試你的代碼,但一目瞭然:

private void AddBodyRow()  
{ 
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
    ... 

既然要填充的剩餘空間不希望SizeType.AutoSize否則身體行將盡量縮小以適合標籤即使標籤設置爲DockStyle.Fill。你需要的是使該行通過SizeType.Percent填滿所有的空間它可以:

private void AddBodyRow()  
{ 
    LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100f)); 
    ... 
+2

感謝您的回覆。我已經瞭解到我在這個特定問題方面的錯誤,並且現在認識到100%意味着在絕對樣式的行被分配之後填滿所有剩餘的空間。再次感謝。 – Zephilim 2010-04-07 17:48:34

6

我掙扎了很長時間與此對象的正確的伸縮動作,直到我發現了,我需要刪除現有款式第一,由設計工具補充說:

.RowStyles.Clear(); 

然後,新樣式的工作:

.RowStyles.Add(new RowStyle(SizeType.AutoSize));