2011-09-01 44 views
10

Es posible que no use el control adecuado para lo que quiero. Estoy llenando una tabla con controles y quiero que cada columna se ajuste automáticamente a los controles que contiene. Por ejemplo, una columna de cuadros de texto será más ancha que una columna de casillas de verificación. No quiero complicarme con la medición si puedo evitarlo, debido a las complejidades de los diferentes sistemas operativos, diferentes DPI, diferentes fuentes, etc. La tabla puede expandirse horizontalmente para ajustarse a los controles, con una barra de desplazamiento. ¿Cómo es esto posible con TableLayoutPanel, o algún otro control?TableLayoutPanel de dimensionamiento

Gracias.

Editado para agregar código:

private void UpdateLocations() 
    { 
     tableLayoutPanel1.RowCount = CurrentSchedule.location.Length + 1; 
     tableLayoutPanel1.ColumnCount = 7; 
     int row = 1; 
     int timeWidth = TextRenderer.MeasureText("00:00:00x", tableLayoutPanel1.Font).Width; 

     Label lab = new Label(); 
     lab.Text = "Location"; 
     tableLayoutPanel1.Controls.Add(lab, 0, 0); 

     lab = new Label(); 
     lab.Text = "Arrive"; 
     tableLayoutPanel1.Controls.Add(lab, 1, 0); 

     lab = new Label(); 
     lab.Text = "Depart"; 
     tableLayoutPanel1.Controls.Add(lab, 2, 0); 

     lab = new Label(); 
     lab.Text = "Pass?"; 
     tableLayoutPanel1.Controls.Add(lab, 3, 0); 

     lab = new Label(); 
     lab.Text = "Path"; 
     tableLayoutPanel1.Controls.Add(lab, 4, 0); 

     lab = new Label(); 
     lab.Text = "Plat"; 
     tableLayoutPanel1.Controls.Add(lab, 5, 0); 

     lab = new Label(); 
     lab.Text = "Line"; 
     tableLayoutPanel1.Controls.Add(lab, 6, 0); 

     foreach (location loc in CurrentSchedule.location) 
     { 
      TextBox tb = new TextBox(); 
      tb.Text = loc.locationID; 
      tableLayoutPanel1.Controls.Add(tb, 0, row); 

      tb = new TextBox(); 
      tb.Text = loc.arrivalTime; 
      tb.Width = timeWidth; 
      tableLayoutPanel1.Controls.Add(tb, 1, row); 

      tb = new TextBox(); 
      tb.Text = loc.departureTime; 
      tb.Width = timeWidth; 
      tableLayoutPanel1.Controls.Add(tb, 2, row); 

      CheckBox cb = new CheckBox(); 
      cb.Checked = loc.passingTime; 
      tableLayoutPanel1.Controls.Add(cb, 3, row); 

      tb = new TextBox(); 
      tb.Text = loc.pathCode; 
      tableLayoutPanel1.Controls.Add(tb, 4, row); 

      tb = new TextBox(); 
      tb.Text = loc.platformCode; 
      tableLayoutPanel1.Controls.Add(tb, 5, row); 

      tb = new TextBox(); 
      tb.Text = loc.lineCode; 
      tableLayoutPanel1.Controls.Add(tb, 6, row); 

      row++; 
     } 
     /*for (int idx = 0; idx < tableLayoutPanel1.RowCount; idx++) 
     { 
      tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize; 
     } 
     for (int idx = 0; idx < tableLayoutPanel1.ColumnCount; idx++) 
     { 
      tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize; 
     }*/ 
    } 

(Sí se necesita refactorización pesada - Sólo estoy tratando de conseguir que funcione primero)

Los bits comentadas hacen fuera de límites excepciones, incluso aunque lógicamente (para mí) no debería. El rango parece estar limitado a lo que configuro en el momento del diseño, no en el tiempo de ejecución.

+0

¿Cuántas columnas tiene? – CharithJ

+0

Si una columna en particular tiene solo casillas de verificación, ¿por qué necesitan cambiar el tamaño? – CharithJ

+0

Las columnas no necesitan cambiar el tamaño dinámicamente, sino establecerlas en un tamaño particular una vez que se agreguen los controles. En este momento estoy usando el tamaño automático, lo que significa que todas las columnas tienen el mismo ancho. – GeoffM

Respuesta

15

Lo sentimos, pero ¿qué hay de malo en tener las columnas establecidas en Autosize? Eso es lo que TableLayoutPanel hace, clasifique las columnas para que se ajusten a los controles que contiene. Expandir la tabla y tener una barra de desplazamiento requeriría que establezca las tablas Propiedad de tamaño automático en verdadero, luego sitúe TableLayoutPanel dentro de otro panel que tenga barras de desplazamiento habilitadas. Pero el tamaño de la columna debería funcionar de la caja, a menos que no entienda bien sus requisitos.

Solo para asegurarse, va a la propiedad de las columnas y ajusta SizeType de cada columna a AutoSize ¿verdad? ¿No solo la propiedad AutoSize de la tabla en sí?

enter image description here

es esto lo que quieres?

-Pot código:

Gracias por el código. Sugeriría que uses el diseñador para hacer mucho de esto. Al menos para configurar las columnas, configurarlas para autosize y agregar las etiquetas de encabezado.

También es posible que desee verificar el control Datagrid y vincularlo a su lista de ubicaciones.

Para obtener este método de trabajo sin embargo:

1) la razón de sus columnas tienen el mismo tamaño se debe a que las etiquetas de título que esté utilizando no estén autosizing. Todos tienen x píxeles de ancho y eso es estirar las columnas.Haga lo siguiente:

Label lab = new Label(); 
lab.AutoSize = true; 
lab.Text = "Location"; 
tableLayoutPanel1.Controls.Add(lab, 0, 0); 

También tendrá que establecer la propiedad AutoSize en true en el control CheckBox y cualquier otra etiqueta que se agregan como contenido.

2) Configurar RowCount y ColumnCount no afectará a la colección RowStyles o ColumnStyles. Tienes 7 Columnas pero solo 2 ColumnStyles. Proveedores:

tableLayoutPanel1.ColumnStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++) 
{ 
    tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); 
} 

tableLayoutPanel1.RowStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.RowCount; i++) 
{ 
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
} 

Sólo otra cosa a tener en cuenta es que algunos controles serán mal alineados en las filas (etiquetas aparecen demasiado alta, por ejemplo). Para solucionarlo establezca la propiedad Margen, normalmente en 3,6,3,0 para alinearlos con cuadros de texto y casillas de verificación, etc.

+0

Sí, eso es lo que quiero . Pero por lo que leí sobre cómo calcula los anchos ("GetPreferredWidth") no debería hacer eso ... Tal vez no estoy estableciendo las propiedades en la combinación correcta. Sin embargo, tengo problemas para configurar las filas y las columnas; vea mi código editado arriba. – GeoffM

+0

DOH! Anchos de etiquetas de encabezado, bien visto! Y el resto de la respuesta también tiene sentido. Gracias. – GeoffM

0

Tendrá que controlar el evento ControlAdded, a continuación, cambiar el tamaño de la columna si la anchura del nuevo control es mayor que el ancho de la columna ...

Usted dice que no quiere jugar con medida, pero si estás redimensionando, tienes que hacerlo. Las fuentes y demás no deberían incluirse si tiene cuidado con TextAlign de sus casillas de verificación, etc. ...

+0

Esperaba algo así como una funcionalidad de tabla similar a HTML donde las columnas (y filas) pueden tamaño automático. Tengo miedo de ponerme a trabajar, digamos Vista, y luego descubro que los bordes de Win7 son 2px más gruesos (o temas, o lo que sea, alteran los parámetros clave). Supongo que si simplemente usar el ancho y la altura del control es lo suficientemente confiable, entonces lo usaré. – GeoffM

+0

El ancho del control debe ser lo suficientemente confiable. Una vez dicho esto, he visto que las aplicaciones de winform (de otros desarrolladores, por lo que no estoy seguro de cómo se hizo) muestran de forma diferente en Windows 7 que en XP, así que no estoy garantizando que funcione :-) – andyhasit

0

Puede usar múltiples splitContainers dentro del panel de otro. Pero no use muchos paneles anidados, puede obtener problemas de redimensionamiento/tamaño como this.

Puede encontrar muchos ejemplos si desea usar SplitContainer.

Cuestiones relacionadas