将Mdi父对象作为对象打开赢得';不允许在VB.Net中从另一个Mdi子窗体打开Mdi子窗体

将Mdi父对象作为对象打开赢得';不允许在VB.Net中从另一个Mdi子窗体打开Mdi子窗体,vb.net,winforms,mdi,mdiparent,Vb.net,Winforms,Mdi,Mdiparent,我在MDI父窗体上遇到了一个奇怪的问题 我打开诸如->登录表单(不是MdiContainer)->MdiParent(是MdiContainer)之类的表单。 但我想将一个布尔值从登录表单传递到MdiParent表单,所以我在MdiParent表单中声明了一个友元变量,并在登录表单中调用了MdiParent对象,如下代码所示 Dim frm As New MdiParent 'frm.NormalMode = True frm.Show() 一切正常。MDI父窗体按预期打开 但我有一些父窗体中

我在MDI父窗体上遇到了一个奇怪的问题
我打开诸如->登录表单(不是MdiContainer)->MdiParent(是MdiContainer)之类的表单。
但我想将一个布尔值从登录表单传递到MdiParent表单,所以我在MdiParent表单中声明了一个友元变量,并在登录表单中调用了MdiParent对象,如下代码所示

Dim frm As New MdiParent
'frm.NormalMode = True
frm.Show()
一切正常。MDI父窗体按预期打开
但我有一些父窗体中的子窗体
子窗体有一个按钮,该按钮用于打开另一个子窗体,其父窗体的父窗体如下所示。

Dim frm1 As New Child2
frm1.MdiParent = MdiParent
frm1.anyvariable = value
frm1.Show()
但是现在它不会打开了。与单击按钮类似,它到达断点时通过
frm1.show()
命令行,但不会打开

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

一些额外的东西:
另外,当我使用
MdiParent.Show()
运行时,在VS2017中暂停代码,并使用Object(上面的一个)和comment
MdiParent.Show()
取消对MdiParent代码的注释,效果很好。同样,停止并重播代码会产生问题。
另外,我还没有在MdiParent形式中使用该布尔变量,所以我想这不是一个问题。
我想,就目前而言,使用公共变量是一种方便的方法

另外,在两个子窗体之间声明友元变量根本不是问题。

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

frm1.MDIPRENT=MDIPRENT
右侧的部分被解释为
MdiParent
类的默认实例,而不是当前表单的
MdiParent
属性。因此,新表单的父对象是未显示的默认实例,而不是显式创建并显示的实例。这也解释了为什么您使用此选项时它会起作用:

mdipent.Show()
它将显示默认实例。修复很容易。您只需限定名称,以表明它实际上是您所引用的当前表单的属性:

frm1.MDIPRENT=Me.MDIPRENT

或者,为表单使用比
MdiParent
更好的名称,如
MainForm
或类似名称。那么就不会有名字冲突了。

我想发生的是,在这一行:

frm1.MDIPRENT=MDIPRENT
右侧的部分被解释为
MdiParent
类的默认实例,而不是当前表单的
MdiParent
属性。因此,新表单的父对象是未显示的默认实例,而不是显式创建并显示的实例。这也解释了为什么您使用此选项时它会起作用:

mdipent.Show()
它将显示默认实例。修复很容易。您只需限定名称,以表明它实际上是您所引用的当前表单的属性:

frm1.MDIPRENT=Me.MDIPRENT

或者,为表单使用比
MdiParent
更好的名称,如
MainForm
或类似名称。这样就不会有名字冲突。

那只是一个打字错误。但问题不在于这一点。这正是我在子窗体中显示的内容,以打开另一个子窗体。我的问题变了,这不是答案@jmcilhinney@bonny,我已经编辑了我的答案,但请在将来复制并粘贴您的实际代码,这样我们就可以避免浪费每个人的时间。对此表示歉意,但我认为如果我输入实际代码,可能会让人无法理解,我必须向他们解释更多。。。下次我会用实际的代码。再次道歉,我实际上在我的项目中使用了不同的名称
BonnyMdi
但原因与上面的评论中所述的相同。这只是一个打字错误。但问题不在于这一点。这正是我在子窗体中显示的内容,以打开另一个子窗体。我的问题变了,这不是答案@jmcilhinney@bonny,我已经编辑了我的答案,但请在将来复制并粘贴您的实际代码,这样我们就可以避免浪费每个人的时间。对此表示歉意,但我认为如果我输入实际代码,可能会让人无法理解,我必须向他们解释更多。。。下次我会用实际的代码。再次道歉,我实际上在我的项目中使用了不同的名称
BonnyMdi
,但原因与上述注释中所述相同。