2011-11-03 10 views
9

Bu konuda birkaç yazı okudum ama hiçbiri yardım etmiyor.Bir TextBox ve Etiket'i TableLayoutPanel'de nasıl hizalarım?

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

C# etiketi kaldırmak için hiçbir neden yoktur @Bradley. Bu, dile özgü bir soru değil ve örneğimin VB.NET'te olması nedeniyle bir VB.NET sorusu oluşturmuyor. VB.NET'te programlama yaptığım anda tüm dillere açığım. Bu yüzden VB.NET'te bir araya getirme örneği daha kolaydı.C# programında çalışan bir kişi, soruna bir çözüm bulabilir ... – Denis

+0

ColumnStyles'ı eklemeyi unuttunuz. Bunu önce tasarımcıyla birlikte örnek bir formda yapın. Solution Explorer penceresinde Tüm Dosyaları Göster simgesini tıklatın. Düğümün yanındaki düğümü açın ve Designer.vb dosyasını çift tıklatın. Tasarımcının oluşturduğu kodu inceleyin. –

+0

@Denis Sadece. Net bir etiket yaptıktan sonra, F # ve diğer .net tabanlı dilleri bıraktığınızdan beri. –

cevap

1

yukarıda Değiştirme:

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

Sen Anchor ve Dock özelliklere sahip bir TableLayoutPanel içinde hizalamak ve streç kontrolleri yapabilirsiniz: Aşağıdaki durumlarda etiket ve metin kutusu hizalamak nasıl.

lblReportType.TextAlign = ContentAlignment.MiddleCenter 
+0

Denedim, (yukarıya bakın). Şanssızlık yok – Denis

+1

@Denis TextAlign'i de deneyin – Damith

+0

TextAlign'i denediniz, şansınız yok ... oldukça iyi bir şey gibi gözüken bir hack var ama iyi bir toplam ... – Denis

11

Etiketler ve:

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 

Bu tamamen kesmek ama bu iş gibi görünüyor ... Belki birisi iyi bir şeyler gelecek Metin kutuları, Anchor özelliğini kullanarak bir TableLayoutPanel içinde hizalanır. Genellikle, Çapa, bir denetimin yeniden boyutlandırılırken hangi denetimin kenara yapışacağını belirler. Ancak bir TableLayoutPanel ile Anchor özelliği, hücre içinde hizalamasını belirler. TextAlign'in TLP'de etiket hizalaması üzerinde bir etkisi yoktur. MSDN

:

Değişim Sola Düğme denetimin Çapa özelliğinin değeri. Düğme kontrolü, hücrenin sol kenarına hizalanacak şekilde hareket eder.

Not: Bu davranış, diğer kapsayıcı denetimlerinin davranışından farklıdır. Diğer kapsayıcı denetimlerinde, Anchor özelliği ayarlandığında alt denetim hareket etmez ve Anchor özelliği ayarlandığında ankraj kontrolü ile ana kapsayıcının sınırı arasındaki mesafe sabitlenir.

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

0

Orada yaklaşım için birkaç yol vardır ama bunu yaparken bu şekilde (bunu nasıl görüneceğini görmek için kod çalıştırmasına böylece gerek) tasarım zaman değişiklik olsun anlamına gelir ve geriye dönük olacak Kontrol tabanlı olarak her bir Label'daki TextAlignment ve Anchor özelliklerini düzeltmeye gerek kalmadan mevcut tüm düzenlerinizi düzeltin.

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) Proje geneli arama/new TableLayoutPanelEx( ile new TableLayoutPanel( değiştirin.

3)?

4) Öncesi Kar

:enter image description here

sonra:enter image description here