2010-02-02 23 views
5

Estoy usando TableLayoutPanel para dividir un área de cliente en 3 filas (solo hay 1 columna). Las filas superior e inferior están diseñadas para ser de altura fija; contendrán un encabezado y un pie de página que inicialmente contienen un control de etiqueta hijo que contiene texto estático (solo para comenzar con). La fila del medio debe ser de tamaño dinámico para llenar el área restante. Este panel central eventualmente contendrá una vista de lista. Tengo una clase director que toma como argumento el (ExplorerTableLayoutPanel) objeto del panel está manejando:TableLayoutPanel: No se pueden obtener correctamente las filas de contenido

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

Hay 3 métodos que crean cada una de las 3 filas en el diseño de la mesa:

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); 
    } 

Los El problema que estoy viendo es que la última fila ocupa la altura de fila fija que he solicitado como 30. Esta parte es correcta. Sin embargo, la primera y la segunda filas están dividiendo el espacio restante por igual entre ellas, que no es lo que quiero. Como puede ver, he establecido explícitamente la altura de fila en 30 para la primera fila exactamente de la misma manera que lo hice para la última fila, pero parece que esto no funciona. La 2ª fila (centro) tiene su tamaño de RowStyle configurado en SizeType.AutoSize, que creo que debe significar que se agote el espacio restante, por lo tanto, no establezca explícitamente el tamaño. Puedo estar equivocado, pero no estoy seguro.

+0

que las costuras se está simulando "muelle" propiedad layout con una mesa. –

Respuesta

11

No he probado el código, pero a simple vista:

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

Puesto que usted quiere llenar el espacio restante no quieren SizeType.AutoSize de lo contrario la fila del cuerpo a tratar de reducir el tamaño para adaptarse a la etiqueta , aunque la etiqueta está configurada en DockStyle.Fill. Lo que se quiere es hacer la fila llenar todo el espacio que pueda usando SizeType.Percent:

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

Gracias por su respuesta. Aprendí el error de mis maneras con respecto a este tema en particular y ahora me doy cuenta de que el 100% significa llenar todo el espacio restante después de que se hayan asignado las filas con estilo absoluto. Gracias de nuevo. – Zephilim

6

he tenido problemas desde hace mucho tiempo con el comportamiento de cambio de tamaño correcto de este objeto hasta que descubrí, que necesito eliminar los estilos existentes en primer lugar, añadido por la herramienta de diseñador:

.RowStyles.Clear(); 

a continuación, los nuevos estilos están trabajando:

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