首页 > 解决方案 > 将 Mdi Parent 作为对象打开不会让在 VB.Net 中从另一个 Mdi 子窗体打开 Mdi 子窗体

问题描述

我在 MDI Parent 表单中遇到了一个奇怪的问题。
我打开表单,例如 ->登录表单(不是 MdiContainer)-> MdiParent(是 MdiContainer)。
但是我想将一个布尔从登录表单传递给 MdiParent表单,所以我在 MdiParent 表单中声明了一个 Friend 变量,并在登录表单中调用了 MdiParent 对象,如下面的代码所示。

Dim frm As New MdiParent
'frm.NormalMode = True
frm.Show()

一切正常。MDIParent 表单按预期打开。
但我有一些 MdiParent 形式的子形式。
子表单有一个按钮,它可以打开另一个带有父 MDIParent 的子表单,如下所示。

Dim frm1 As New Child2
frm1.MdiParent = MdiParent
frm1.anyvariable = value
frm1.Show()

但是现在打不开了。就像单击按钮一样,它会通过frm1.show()命令行进入断点,但它不会打开。

在我直接打开 MDIParent 之前MdiParent.show(),一切正常。
使用此代码正确打开所有子窗体。

额外的东西:
另外,当我MdiParent.Show() 在 VS2017 中运行并暂停代码并使用 Object(上面的那个)取消注释 MDIParent 代码并注释MdiParent.Show() 它工作正常。同样,停止和重放代码会产生问题。
另外,我还没有在 MdiParent Form 中使用该布尔变量,所以我猜这不是问题。
我猜现在使用公共变量是一种方便的方法。
此外,在两个子表单之间声明 Friend 变量根本不是问题。

标签: vb.netwinformsmdimdiparent

解决方案


我认为正在发生的事情是,在这一行:

frm1.MdiParent = MdiParent

右边的部分被解释为MdiParent类的默认实例,而不是MdiParent当前表单的属性。因此,新表单的父级是您未显示的默认实例,而不是您显式创建并显示的实例。这也可以解释为什么当你使用它时它会起作用:

MdiParent.Show()

这是显示默认实例。修复很容易。您只需要限定名称以表明它实际上是您所指的当前表单的属性:

frm1.MdiParent = Me.MdiParent

或者,为您的表单使用比MdiParent、like 等更好的名称MainForm。这样就不会有名字冲突了。


推荐阅读