2011-06-01 109 views
8

我动态地为TableLayoutPanel生成控件。我在每一行都有一个删除按钮。当我点击时,该行必须被删除。有没有办法从TableLayoutPanel的一行中删除所有控件?

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

我还没有显示代码来添加类似于上面的文本框。我可以得到点击按钮的行号。使用这个,如何从这一行中删除所有控件。

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 

回答

20

基本上,你必须:

  • 从该行获得的控制列表,并从TLP
  • 删除它们从TLP
  • 将新行删除相应的行样式删除之后每行中每个控件的索引
  • 减少RowCount

这里是VB.NET代码做同样的事情。

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 

这是一个C#扩展方法,将为您做到这一点。

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

@emaillenin的内容:谢谢你的翻译到VB.NET – 2011-06-02 15:27:00

+0

为什么人们必须删除RowStyle? – sammarcow 2012-02-09 16:08:33

3

除了约翰和emaillenin的答案,你应该改变以下行

panel.SetRow(control, i - 1); 

对此

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

空字段也跨区控制将在这里如果孤单抛出一个错误没有检查为空。

-7

为什么这么多的勤劳...... 使用 tableLayoutpanel1.Controls.Clear()

这将清除表面板

+5

这是*不* OP要求做的事情。 – 2013-02-12 06:18:33

相关问题