Vb.net 使用表单B启用表单A的对象

Vb.net 使用表单B启用表单A的对象,vb.net,winforms,inheritance,vb.net-2010,Vb.net,Winforms,Inheritance,Vb.net 2010,我正在使用此代码禁用form.load事件中的form[A] Public Sub disableAll(ByVal root As Control) For Each root In root.Controls If Not root.Name.ToString = "cmdLogin" Then root.Enabled = False End If Next End Sub 使用此代码禁用(Me) 它按预期工作 现

我正在使用此代码禁用form.load事件中的form[A]

Public Sub disableAll(ByVal root As Control)
    For Each root In root.Controls
        If Not root.Name.ToString = "cmdLogin" Then
            root.Enabled = False

        End If
    Next
End Sub
使用此代码
禁用(Me)

它按预期工作

现在的问题是启用它,我有这段代码,可以使用表单[B]中的命令按钮启用表单[A]中的对象

   Public Sub enableAll(ByVal root As Control)
        For Each root In root.Controls
            If Not root.Name.ToString = "cmdLogin" Then
                root.Enabled = True
            Else
                root.Hide()
            End If
        Next
    End Sub
我使用了
enablell(frmMain)
enablell(my.Forms.frmMain)
enablell(WindowsApplication1.frmMain)


但是它们都不起作用,我没有收到错误消息,检查我的VB.Net 2010的中间窗口,
frmMain.Menustrip1.Enabled.Tostring
设置为True,而当我在frmMain中检查时,Enabled属性设置为false,这是为什么?

在FormB中,您需要使用FormA(frmMain)的实例当前显示的。您使用的是frmMain的默认实例(MS制作的一个非常混乱且反oop的设计选项)

您可以通过查看Application.OpenForms集合检索显示的frmMain实例

在调用enableAll之前,请运行此代码

Dim f = Application.OpenForms("frmMain")
If f IsNot Nothing then
    enableAll(f)
End If

如果首先显示的是默认实例,那么在这种情况下使用默认实例是没有问题的。当人们创建自己的实例,然后在其他地方引用默认实例时,就会出现问题。可以在任何地方使用默认实例,也可以不使用默认实例。值得注意的是,应用程序的启动窗体是其类型的默认实例。