【问题标题】:How to retrieve collection of all child forms, where form A is calling form B and B is the child如何检索所有子表单的集合,其中表单 A 调用表单 B 而 B 是子表单
【发布时间】:2016-03-02 18:49:05
【问题描述】:

我尝试过用谷歌搜索方法来获取当前表单的子表单的数组或列表,但无济于事。有没有标准的方法来做这样的事情?我正在使用 .net frameowkr 4.0 Visual Studio 2013。

我试过了

For Each childForm As Form In Me.MdiChildren
    Debug.WriteLine(childForm.Name)
Next

当我知道存在子窗体时,但我从未在调试中输入 WriteLine 代码。长度为0。

【问题讨论】:

  • 您标记了vb.netc# 是否重要,因为您提供的示例在vb.net 中。您还确定您引用的Form 确实有孩子吗?引用表单应具有属性IsMdiContainer = True。如果是这样,那么您应该能够获得对父级(我)开放的所有子级实例......
  • @Codexer 任何一种语言的解决方案都可以。两者之间的转换或多或少是微不足道的。
  • 另外,您的Form 类的名称是什么。您可以在 For Each 语句中使用它们的类名...例如:For Each childForm As YOURCLASSNAME In Me.MdiChildren... 但如果不是那种类型,也可能引发异常...然后您可以将其声明为对象然后使用它...
  • @Codexer 是的,我可以,但根据我的经验,检索类型与迭代对象的长度无关。我正在寻找一种在 winforms 中执行此类操作的标准方法,除非我尝试标准并失败,否则代码的细节无关紧要。此外,更通用的解决方案会更有利。
  • 我们可以看看你在子表单实例化时正在做什么的例子吗?只要设置了表单 .MdiParent 属性并且此代码是从父表单运行的,您所拥有的就应该可以工作。

标签: c# .net vb.net winforms


【解决方案1】:

好的,我认为你想要的是查看 Application.OpenForms 集合。

Form1 实例化 Form2 的一个新实例

Dim f2 as New Form2
f2.Name = "foo"
f2.Show

然后在 form1 中你也许可以得到你想要的东西

For Each child as Form in Application.OpenForms.OfType(Of Form2)()
    Debug.WriteLine(child.Name)
Next

【讨论】:

  • 不幸的是,我认为您正在使用更高版本的 .net 框架。它说“OfType 不是 System.Windows.Forms.FormsCollection 的成员。”但这看起来像我想要的,只要集合中的每个表单都是您为每个表单调用的表单的子级。
  • 是的,完全错过了 4.0 框架的限制。然而,这并不关心哪个表单实例化了 form2,它只是从集合中提取 Form2 类型的表单,所以它可能仍然不是您想要的。我不得不问,如果form1实例化了form2的实例与form3实例化了form2的实例,你将如何区分?我认为没有谁实例化了谁的容器,但我认为您可以创建一个 List(Of T) 并在每次实例化时添加到它。
  • 是的,列表将是一个解决方案,但要回答您的问题,当我从 A 打开表单 B0 并从 C (B0=B1) 打开表单 B1 时,当我关闭 A 时,仅关闭 B0。 C 和 B1 仍然存在。我希望在代码中重现这个 winforms 固有的功能,而不必自己使用列表来跟踪它。
猜你喜欢
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多