2011-06-01 27 views
8

Bir TableLayoutPanel için dinamik olarak denetimler oluşturuyorum. Her satırda bir silme düğmem var. Bunu tıkladığımda, o satırın kaldırılması gerekiyor.TableLayoutPanel'deki bir satırdaki tüm denetimleri kaldırmanın bir yolu var mı?

Dim removeBtn As New Button 
    AddHandler removeBtn.Click, AddressOf DeleteRow 
    tlp.Controls.Add(removeBtn, 5, rowCount) 

Yukarıdaki gibi benzer metin kutuları eklemek için kodu göstermedim. Tıklanan düğmenin satır numarasını alabilirim. Bunu kullanarak, bu satırdaki tüm denetimleri nasıl kaldırabilirsiniz. Temelde

Private Sub DeleteRow(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Dim currentRow As Integer = CType(CType(sender, Button).Parent, TableLayoutPanel).GetRow(CType(sender, Button)) 
    'Using this currentRow, how to delete this Row 
End Sub 

cevap

20

sahip olmak:

  • yeni bir satır Set TLP
  • den gelen satır stili çıkarın o satırdan kontrollerin listesini almak ve TLP
  • silin silinen bir satırdaki her satırdaki her bir denetim için dizin
  • RowCount değerini azaltma

İşte bunu yapmak için VB.NET kodu.

Public Sub RemoveRow(ByRef panel As TableLayoutPanel, ByRef rowIndex As Integer) 

    panel.RowStyles.RemoveAt(rowIndex) 
    Dim columnIndex As Integer 
    For columnIndex = 0 To panel.ColumnCount - 1 
     Dim Control As Control = panel.GetControlFromPosition(columnIndex, rowIndex) 
     panel.Controls.Remove(Control) 
    Next 
    Dim i As Integer 
    For i = rowIndex + 1 To panel.RowCount - 1 
     columnIndex = 0 
     For columnIndex = 0 To panel.ColumnCount - 1 
      Dim control As Control = panel.GetControlFromPosition(columnIndex, i) 
      panel.SetRow(control, i - 1) 
     Next 
    Next 
    panel.RowCount -= 1 
End Sub 

İşte sizin için bunu yapacak bir C# uzantısı yöntemidir.

Johann ve emaillenin yanıtlarının yanı sıra
public static void RemoveRow(this TableLayoutPanel panel, int rowIndex) 
{ 
    panel.RowStyles.RemoveAt(rowIndex); 

    for (int columnIndex = 0; columnIndex < panel.ColumnCount; columnIndex++) 
    { 
     var control = panel.GetControlFromPosition(columnIndex, rowIndex); 
     panel.Controls.Remove(control); 
    } 

    for (int i = rowIndex + 1; i < panel.RowCount; i++) 
    { 
     for (int columnIndex = 0; columnIndex < panel.ColumnCount; columnIndex++) 
     { 
      var control = panel.GetControlFromPosition(columnIndex, i); 
      panel.SetRow(control, i - 1); 
     } 
    } 

    panel.RowCount--; 
} 
+1

masa panelinin içeriğini silecektir: VB.NET –

+0

için çeviri için teşekkürler Neden RowStyle'ı kaldırmak zorunda mı? – sammarcow

3

hiçbir kontroller burada gidecekseniz eğer bir hata atar yayılmış ayrıca aşağıdaki satırı bu

if (control != null) panel.SetRow(control, i - 1); 

Boş alanlar için

panel.SetRow(control, i - 1); 

değiştirip gerekir boş kontrol et.

-7

neden bu kadar teriyle ... Kullanım tableLayoutpanel1.Controls.Clear()

Bu @emaillenin

+5

OP nedir? * Sorusu nedir? –

İlgili konular