【问题标题】:Not all controls in collection are being copied并非集合中的所有控件都被复制
【发布时间】:2011-12-13 16:31:15
【问题描述】:

我在这里有点困惑。我将所有控件从一个窗体复制到主窗体上的面板,但由于某种原因,只有大约一半的控件被复制。

 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 个元素:

【问题讨论】:

  • 循环是否迭代 12 次?
  • 你确定 serverDic(selection) 有 12 个控件而不是 serverDic 吗?
  • 是的,我很肯定。我在问题中添加了一张图片以显示它。

标签: vb.net controls


【解决方案1】:

这里的问题是您正在迭代您正在更改的集合。当您将Control 添加到容器时,它会从其先前的父级中隐式删除,因此会从query 中删除。这就是为什么您会看到恰好有一半的项目被删除。

对于大多数集合,这会更加明显,因为如果在枚举期间修改它们会抛出。 query 的主要来源是 ControlCollection,它允许在枚举时进行修改。

要解决此问题,只需在 For Each 循环之前添加以下行。

query = query.ToList()

【讨论】:

  • 啊,这就解释了。我不知道添加控件也会将其从父级中删除!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2023-04-09
  • 2015-02-24
  • 1970-01-01
相关资源
最近更新 更多