2010-02-02 95 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));