Как выровнять TextBox и Label в TableLayoutPanel? - PullRequest
10 голосов
/ 03 ноября 2011

Я прочитал несколько статей на эту тему, но, похоже, ни одна из них не помогла. Как выровнять метку и текстовое поле в следующем случае:

 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

Ответы [ 5 ]

13 голосов
/ 18 февраля 2015

Метки и текстовые поля выровнены внутри TableLayoutPanel с помощью свойства Anchor. Обычно Anchor определяет, какой край родительского элемента управления будет придерживаться при изменении размера. Но с TableLayoutPanel свойство Anchor определяет выравнивание внутри ячейки. TextAlign не влияет на выравнивание меток в TLP.

Из MSDN:

Измените значение свойства Anchor элемента управления Button на Left. Элемент управления Button перемещается для выравнивания с левой границей ячейки.

Примечание. Это поведение отличается от поведения других элементов управления контейнером. В других элементах управления контейнера дочерний элемент управления не перемещается, когда установлено свойство Anchor, и расстояние между привязанным элементом управления и границей родительского контейнера фиксируется в то время, когда свойство Anchor установлено.

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

7 голосов
/ 03 ноября 2011

Вы можете выравнивать и растягивать элементы управления в TableLayoutPanel со свойствами Anchor и Dock .

lblReportType.TextAlign = ContentAlignment.MiddleCenter 
1 голос
/ 04 ноября 2011

Заменив вышеприведенное на:

  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

Это полный взлом, но, похоже, это работает ... Может быть, кто-то придумает что-нибудь получше:

 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
0 голосов
/ 26 апреля 2018

Тот, который работал для меня, был таким:

    Label lblAmountInWords = new Label();

    lblAmountInWords.Text = "FOUR THOUSAND THREE HUNDRED AND TWENTY ONLY";
    lblAmountInWords.Font = new Font("Arial", 9, FontStyle.Bold);
    lblAmountInWords.AutoSize = false;
    lblAmountInWords.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
    lblAmountInWords.TextAlign = ContentAlignment.MiddleCenter;

    tableLayoutPanelAmountInWords.Controls.Add(lblAmountInWords, 0, 0);
0 голосов
/ 30 марта 2017

Есть несколько способов приблизиться к этому, но, делая это таким образом, вы получаете изменения во время разработки (поэтому не нужно запускать код, чтобы увидеть, как он будет выглядеть), и он будет задним числом исправлять все ваши существующие макеты безнеобходимо исправить свойства TextAlignment и Anchor для каждого Label для каждого элемента управления.

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) Поиск / замена всего проекта new TableLayoutPanel( на new TableLayoutPanelEx(.

3) ?

4) Прибыль

До: enter image description here

После: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...