2011-06-01 112 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

相關問題