Повторное создание динамических элементов управления - PullRequest
1 голос
/ 05 ноября 2011

У меня есть программа 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()

Где: Панели, DataGrids и lblCounts являются списками ArrayLists, содержащими элементы управления

Когда я воссоздаю панели, я получаю панели и все их элементы управления, кроме кнопок Когда я прохожу через отладчик, я вижу, что кнопки удаляются, и я вижу, что они создаются, но они не отображаются на панели Есть идеи?

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Ваш вопрос касается кнопки, которая не появляется, когда вы добавляете элементы управления, но вы показываете только процесс удаления, который имеет недостатки.

Создайте UserControl, который содержит ваши метки, сетку и кнопку. Добавьте это к вашей форме. Вот для чего нужны UserControls.

Кроме того, когда вы закончили использовать его, просто позвоните:

MyControl.Dispose()

В противном случае, я подозреваю, что у вас утечка памяти. Удалить не разрушает объект.

0 голосов
/ 05 ноября 2011

Попробуйте это

 WHILE Panels(P).controls.count > 0
    Panels(P).controls.removeAt(1)
0 голосов
/ 05 ноября 2011
For Each PControl In Panels(P).controls
    Panels(P).controls.remove(PControl)
Next

Эта часть может выкинуть вас из вашего кода. «Для каждого» не нравится, когда его элементы меняются во время выполнения. проверить это с помощью точек останова. если это действительно проблема, вы могли бы сделать ..

ленивый метод, просто добавив .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...