最近碰到使用动态控件的情况,创建动态控件数组还是比较简单的,但是当控件数量需要变化(比如减少时),通过遍历方法,remove过期的控件后,发现总是有”漏网之鱼“,没想明白这个遍历的方法哪里出问题了,通过多次遍历,又可以清除干净,我想可能是刷新不及时吧!然后就想到一个办法,多次remove,直到符合条件要删除的控件总数为0,试过后,问题解决了。这个代码主要是根据行列数,以及不同的行高和列宽,创建一个表格。
Private Sub TB_Row_TextChanged(sender As Object, e As EventArgs) Handles TB_Row.TextChanged
Dim i, row As Byte
row = Val(TB_Row.Text)
Static rowbak As Byte = row
If row = 0 Then
Return
End If
If rowbak <> row Then '删除过期控件
Dim un As Control
Remove:
Dim cnt As Byte = 0
For Each un In tp_table.Controls
If InStr(un.Name, "_Row_") > 0 Then
tp_table.Controls.Remove(un)
End If
Next
For Each un In tp_table.Controls '反复删除才能清除干净
If InStr(un.Name, "_Row_") > 0 Then
cnt += 1
End If
Next
If cnt > 0 Then
GoTo Remove
End If
rowbak = row
End If
Dim LBL_Row As Label() = New Label(row) {} '声明label控件数组
Dim Tbox_Row As TextBox() = New TextBox(row) {} '声明textbox控件数组
For i = 0 To row - 1
LBL_Row(i) = New Label() '创建label控件数组
Next
For i = 0 To row - 1
Tbox_Row(i) = New TextBox() '创建textbox控件数组
Next
For i = 0 To row - 1
LBL_Row(i).Location = New System.Drawing.Point(120, 80 + i * 25)
LBL_Row(i).Text = Chr(&H41 + i)
LBL_Row(i).Name = "Label_Row_" + Str(i)
LBL_Row(i).AutoSize = True
tp_table.Controls.Add(LBL_Row(i))
Tbox_Row(i).Location = New System.Drawing.Point(140, 80 + i * 25)
Tbox_Row(i).Size = New Size(20, 20)
Tbox_Row(i).Visible = True
Tbox_Row(i).Name = "Textbox_Row_" + Str(i)
Tbox_Row(i).Text = "1"
tp_table.Controls.Add(Tbox_Row(i))
Next
End Sub