8

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
4

3 に答える 3

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--;
}
于 2011-06-01T13:49:50.183 に答える
3

Johannとemailleninの回答に加えて、次の行を変更する必要があります

    panel.SetRow(control, i - 1);

これに

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

nullのチェックがない場合、空のフィールドとスパンされたコントロールはここでエラーをスローします。

于 2011-08-11T10:47:12.823 に答える
-7

なぜこれほど大変な作業なのか...tableLayoutpanel1.Controls.Clear()を使用する

これにより、テーブルパネルの内容がクリアされます

于 2013-02-12T06:10:41.267 に答える