重新创建动态控件

时间:2011-11-05 04:27:11

标签: vb.net dynamic controls

我有一个VB.Net WinForm程序。 我用控件动态创建面板。 每个小组都有:      2个标签      1 DataGridView      1个按钮 我第一次创建面板时一切正常。 一切都得到了创造,一切都在发挥作用。

如果我必须重新创建表单,我会使用以下代码删除现有面板(及其控件):

For P = 0 To Panels.Count - 1
    For Each PControl In Panels(P).controls
        Panels(P).controls.remove(PControl)
    Next
    Me.Controls.Remove(Panels(P))
Next
Panels.Clear()
DataGrids.Clear()
lblCounts.Clear()

其中:    Panels,DataGrids,& lblCounts是包含控件的ArrayLists

当我重新创建面板时,我得到面板和除按钮之外的所有控件 当我单步执行调试器时,我看到按钮被删除,我看到它们正在创建,但它们没有出现在面板中 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您的问题是关于添加控件时没有显示按钮,但您只显示删除过程,这是有缺陷的。

创建一个包含标签,网格和按钮的UserControl。将其添加到您的表单。这就是UserControls的用途。

此外,完成使用后,只需致电:

MyControl.Dispose()

否则,我怀疑你是在泄漏记忆。删除不会破坏对象。

答案 1 :(得分:0)

For Each PControl In Panels(P).controls
    Panels(P).controls.remove(PControl)
Next

这部分可能会让您退出代码。 “For Each”在执行期间其项目发生变化时不喜欢它。用断点检查它。如果真的是一个问题,你可以做..

懒惰方法,只需添加.ToList

即可
For Each PControl In Panels(P).controls.ToList
    Panels(P).controls.remove(PControl)
Next

类似于:

Dim AllControls as New List(Of control)
AllControls.AddRange(Panels(P).controls)
For Each PControl in AllControls
    Panels(P).controls.remove(PControl)
Next

或:

For i as integer = Panels(P).controls.count -1 to 0 step -1
    Dim PControl as control = Panels(P).controls(i)
    PControl.parent.remove(PControl)
Next

答案 2 :(得分:0)

试试这个

 WHILE Panels(P).controls.count > 0
    Panels(P).controls.removeAt(1)