将 Mdi Parent 作为对象打开不会让 VB.Net 中的另一个 Mdi 子窗体打开 Mdi 子窗体
Opening Mdi Parent as an Object won't let open Mdi Child form from another Mdi Child Form in VB.Net
我在使用 MDI 父窗体时遇到了一个奇怪的问题。
我打开类似的表格 -> 登录表格(不是 MdiContainer) -> MdiParent(是 MdiContainer)。
但是我 想将一个布尔值 值 从登录表单传递到 MdiParent 表单,所以我 在 MdiParent[=45] 中声明了一个 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.show()
那样直接打开 MDIParent 之前一切正常。
使用此代码可正确打开所有子窗体。
额外的东西:
此外,当我 运行 和 MdiParent.Show()
并暂停 VS2017 中的代码并使用对象(上面的那个)取消注释 MDIParent 代码并注释 MdiParent.Show()
它工作正常。同样,停止并重播代码会产生问题。
另外,我还没有在 MdiParent Form 中使用那个布尔变量,所以我猜这不是问题。
我想,就目前而言,使用 Public 变量是一种方便的方法。
在两个子表单之间声明 Friend 变量也不是问题。
我认为发生的事情是,在这一行中:
frm1.MdiParent = MdiParent
右边的部分被解释为 MdiParent
class 的默认实例,而不是当前形式的 MdiParent
属性。因此,新表单的父级是您未显示的默认实例,而不是您显式创建并显示的实例。这也可以解释为什么当你使用它时它会起作用:
MdiParent.Show()
正在显示默认实例。修复很容易。您只需要限定名称以表明它实际上是您所指的当前表单的 属性:
frm1.MdiParent = Me.MdiParent
或者,使用比 MdiParent
更好的表单名称,例如 MainForm
等。这样就不会有名字冲突了。
我在使用 MDI 父窗体时遇到了一个奇怪的问题。
我打开类似的表格 -> 登录表格(不是 MdiContainer) -> MdiParent(是 MdiContainer)。
但是我 想将一个布尔值 值 从登录表单传递到 MdiParent 表单,所以我 在 MdiParent[=45] 中声明了一个 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.show()
那样直接打开 MDIParent 之前一切正常。
使用此代码可正确打开所有子窗体。
额外的东西:
此外,当我 运行 和 MdiParent.Show()
并暂停 VS2017 中的代码并使用对象(上面的那个)取消注释 MDIParent 代码并注释 MdiParent.Show()
它工作正常。同样,停止并重播代码会产生问题。
另外,我还没有在 MdiParent Form 中使用那个布尔变量,所以我猜这不是问题。
我想,就目前而言,使用 Public 变量是一种方便的方法。
在两个子表单之间声明 Friend 变量也不是问题。
我认为发生的事情是,在这一行中:
frm1.MdiParent = MdiParent
右边的部分被解释为 MdiParent
class 的默认实例,而不是当前形式的 MdiParent
属性。因此,新表单的父级是您未显示的默认实例,而不是您显式创建并显示的实例。这也可以解释为什么当你使用它时它会起作用:
MdiParent.Show()
正在显示默认实例。修复很容易。您只需要限定名称以表明它实际上是您所指的当前表单的 属性:
frm1.MdiParent = Me.MdiParent
或者,使用比 MdiParent
更好的表单名称,例如 MainForm
等。这样就不会有名字冲突了。