2011-11-03 25 views
9

He leído algunos artículos sobre esto pero ninguno parece ayudar. ¿Cómo puedo alinear la etiqueta y el cuadro de texto en el siguiente caso:¿Cómo alineo un TextBox y una etiqueta en TableLayoutPanel?

Using frm As New frmWithTableLayout 
    frm.TableLayoutPanel1.ColumnCount = 2 
    frm.TableLayoutPanel1.RowCount = 3 

    'create report Type' 
    Dim lblReportType As New Label 
    lblReportType.Text = "Report Type" 
    lblReportType.Dock = DockStyle.Right 
    Dim reportType As New System.Windows.Forms.TextBox() 
    reportType.Text = "Income" 
    frm.TableLayoutPanel1.Controls.Add(lblReportType, 0, 0) 
    frm.TableLayoutPanel1.Controls.Add(reportType, 1, 0) 
End Using 
+1

@Bradley No hay ninguna razón para quitar la etiqueta de C#. Esta no es una pregunta específica del idioma y solo porque mi ejemplo estaba en VB.NET no lo convierte en una pregunta de VB.NET. Estoy abierto a todos los idiomas, justo en el momento en que estaba programando en VB.NET, por lo que el ejemplo fue más fácil de armar en VB.NET.Alguien que programa en C# podría encontrar una solución al problema ... – Denis

+0

Olvidó agregar ColumnStyles. Haga esto en un formulario de muestra primero con el diseñador. Haga clic en el icono Mostrar todos los archivos en la ventana del Explorador de soluciones. Abra el nodo al lado del formulario y haga doble clic en el archivo Designer.vb. Mira el código que generó el diseñador. –

+0

@Denis Solo lo convertiría en una etiqueta .net solo entonces, ya que dejó F # y otros lenguajes basados ​​en .net. –

Respuesta

1

Sustitución de la anterior con:

Using frm As New frmWithTableLayout 
      frm.SetupTableLayout(2, 3) 

      'create report Type' 
      Dim lblReportType As New Label 
      lblReportType.Text = "Report Type" 
      frm.LayoutControl(lblReportType, 0, 0) 
      Dim tbReportType As New System.Windows.Forms.TextBox() 
      tbReportType.Text = "Income" 
      frm.LayoutControl(tbReportType, 1, 0) 

      frm.ShowDialog() 
    End Using 

Este es un truco total, pero esto parece funcionar ... Tal vez alguien va a venir con algo mejor:

Public Sub LayoutControl(ByVal c As Control, ByVal column As Integer, ByVal row As Integer) 
     If TypeOf c Is Label Then 
      Dim clabel As Label = DirectCast(c, Label) 
      clabel.TextAlign = ContentAlignment.TopCenter 
      clabel.Dock = DockStyle.Right 
      clabel.Margin = New Padding(clabel.Margin.Left, clabel.Margin.Top + 5, clabel.Margin.Right, clabel.Margin.Bottom) 

     ElseIf TypeOf c Is System.Windows.Forms.TextBox Then 
      Dim ctbox As System.Windows.Forms.TextBox = DirectCast(c, System.Windows.Forms.TextBox) 
      ctbox.Margin = New Padding(0, 3, 0, 3) 
      ctbox.TextAlign = HorizontalAlignment.Center 
     End If 

     TableLayoutPanel1.Controls.Add(c, column, row) 
    End Sub 

    Public Sub SetupTableLayout(ByVal numOfColumns As Integer, ByVal numOfRows As Integer) 
     TableLayoutPanel1.ColumnCount = numOfColumns 
     TableLayoutPanel1.RowCount = numOfRows 
     While TableLayoutPanel1.RowStyles.Count < TableLayoutPanel1.RowCount 
      TableLayoutPanel1.RowStyles.Add(New RowStyle()) 
     End While 

     For Each row As RowStyle In TableLayoutPanel1.RowStyles 
      With row 
       .SizeType = SizeType.Percent 
       .Height = 100/TableLayoutPanel1.RowCount 
      End With 
     Next row 
    End Sub 
7

puede alinear y controles de estiramiento en una TableLayoutPanel con los Anchor y Dock propiedades.

lblReportType.TextAlign = ContentAlignment.MiddleCenter 
+0

Lo intenté (ver arriba). Sin suerte – Denis

+1

@Denis intente TextAlign también – Damith

+0

Intenté TextAlign, sin suerte ... tengo un truco en el lugar que parece estar haciéndolo bastante bien, pero bueno, es un truco total ... – Denis

11

Etiquetas y Los cuadros de texto se alinean dentro de un TableLayoutPanel usando la propiedad Anchor. Por lo general, Anchor determina qué borde del elemento principal se quedará con un control al cambiar el tamaño. Pero con un TableLayoutPanel, la propiedad Anchor determina alineación dentro de la celda. TextAlign no tiene efecto en la alineación de etiquetas dentro de un TLP.

De MSDN:

Cambiar el valor de la propiedad del ancla en el control Button a la izquierda. El control del botón se mueve para alinearse con el borde izquierdo de la celda.

Nota: Este comportamiento difiere del comportamiento de otros controles de contenedor. En otros controles de contenedor, el control secundario no se mueve cuando se establece la propiedad Ancla, y la distancia entre el control anclado y el límite del contenedor principal se fija en el momento en que se establece la propiedad Ancla.

https://msdn.microsoft.com/en-us/library/ms171691%28v=vs.90%29.aspx

0

Hay algunas formas de acercarse a ella, pero hacerlo de esta manera significa que usted obtiene los cambios en tiempo de diseño (por lo que no hay necesidad de ejecutar el código para ver cómo se verá), y lo hará con carácter retroactivo corrija todos los diseños existentes sin necesidad de corregir las propiedades TextAlignment y Anchor en cada Label control por control.

1)

public class TableLayoutPanelEx : TableLayoutPanel 
{ 
    public TableLayoutPanelEx() 
    { 
     ControlAdded += OnControlAdded;    
    } 

    private void OnControlAdded(object sender, ControlEventArgs args) 
    { 
     var control = args.Control as Label; 
     if (control != null) { 
      control.TextAlign = ContentAlignment.MiddleLeft;     
      control.Anchor = (AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left); 
     }    
    } 
} 

2) búsqueda en todo el proyecto/reemplazar new TableLayoutPanel( con new TableLayoutPanelEx(.

3)?

4) beneficio

Antes:enter image description here

Después:enter image description here

Cuestiones relacionadas