Не все элементы управления в коллекции копируются - PullRequest
1 голос
/ 13 декабря 2011

Я немного запутался здесь.Я копирую все элементы управления из одной формы в панель главной формы, и по какой-то причине копируется только около половины из них.

 Private Sub switchComponent()
         Dim selection As String = TreeView1.SelectedNode.Text

         Panel1.Controls.Clear()

         Dim query = From cont In serverDic(selection).Controls
                     Select cont

         For Each copier As Control In query
             Panel1.Controls.Add(copier)
         Next

 End Sub

serverDic определяется как:

 Dim serverDic As New Dictionary(Of String, frmServer)

При пошаговом выполнении кода serverDic (selection) .Controls имеет 12 элементов, но копируются только 6 из них.В следующий раз, когда вызывается, копируются только 3.Разве Panel1.Controls.clear () каким-то образом уничтожает ссылки?

РЕДАКТИРОВАТЬ: Просто чтобы показать, что в коллекции 12 элементов infact:

enter image description here

1 Ответ

2 голосов
/ 13 декабря 2011

Проблема в том, что вы перебираете коллекцию, которую вы меняете.Когда вы добавляете Control к контейнеру, он неявно удаляется из своего предыдущего родителя и, следовательно, query.Вот почему вы видите, что половина предметов удаляется.

С большинством коллекций это было бы более очевидно, потому что они бросили бы, если бы изменялись во время перечисления.Тем не менее, основным источником query является ControlCollection, который допускает изменения при перечислении.

Чтобы решить эту проблему, просто добавьте следующую строку перед циклом For Each.

query = query.ToList()
...