按变量值打开表单

Open Form By Variable Value

表单名称来自一个变量。我想从变量值打开表单。

In VBA load("UserFormName") 将显示表格。但我不知道如何在 VB.Net.

好的,当然人们希望能够通过字符串名称打开表单。

当您创建 vb.net winforms 项目时,所有表单都可以作为 "base" 静态 class.

您经常看到很多代码,因此只需使用基本形式 class。

如果我需要显示 form2,那么我真的不需要创建该表单的实例(除非您想拥有该表单的多个实例。因此大量代码将简单地启动 + 使用"base static" class 那种形式。

例如:

Form2.Show()

我不认为这是一种糟糕的做法,因为您认为 "set" 项目设置中的启动表单的项目设置有什么作用?

它只是将 "mainForm" = 的内置实例设置为您的启动表单,它不会创建新实例。

所以,现在我们都同意 15 年以上,任何在他们的项目中设置启动表单的人都不是在创建该表单的新实例,而是实际上使用基础 class 实例。这确实是一个编程选择。

因此,通过字符串名称显示(显示)表单的基本静态实例的代码如下所示:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim strForm As String = "Form1"
    ShowFormByName(strForm)

End Sub

Public Sub ShowFormByName(strFormName As String)

    System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & strFormName).show()

End Sub


Private Function FormByName(strFormName As String) As Form
    Return System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(ProductName & "." & strFormName)
End Function

但是,上面包含一个辅助子程序,它将简单地 "show" 构建在表单实例中。

并且上面还包含了return class 类型的表单的功能,因为可以肯定的是,很多开发人员更喜欢先创建一个表单实例,然后 "show()"它。

因此,通常我们确实需要多个实例,或者我们只是更喜欢创建表单对象的新实例的编码方法。

因此,我们使用第二个辅助函数 return 我们通过字符串传递的类型的表单对象。

因此,要显示 form1 的 3 个实例,但第一个实例是基础 class,然后是该表单的另外两个全新实例,我们有以下代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim strForm As String = "Form1"
    ShowFormByName(strForm)

    Dim f1 As Form = FormByName(strForm)
    Dim f2 As Form = FormByName(strForm)

    f1.Show()
    f2.Show()

End Sub

所以上面的代码片段显示了如何显示内置的基本 class 表单,而无需创建该表单的实例。

但是,我们加载的接下来的两个表单是 "new" 该表单的 "string" 实例。

因此,辅助子和辅助功能将为您提供两种选择,让您可以选择哪种偏好使您的船漂浮。

Dim form = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(Application.ProductName & "." & MySubForm)
Dim frm As New Form
frm = form
frm.MdiParent = AFrmMainScreen
frm.WindowState = FormWindowState.Maximized
frm.Show()

我更喜欢使用 Reflection.Assembly.GetEntryAssembly,因为我在一个解决方案中使用多个不同的项目。这使我可以将此代码放在具有用户控件的不同项目 (dll) 中,然后我可以在多个解决方案中重复使用该控件。您也不需要知道表单的 "Namespace",只要它在启动项目中即可。

下面的代码从入口程序集的导出类型中获取表单类型,然后使用 Activator.CreateInstance 创建表单的新实例。然后我return那个窗体在函数里。

Public Function GetForm(ByVal objectName As String) As Form
    Try
        Dim frmType = Reflection.Assembly.GetEntryAssembly.GetExportedTypes.FirstOrDefault(Function(x) x.Name = objectName)
        Dim returnForm = TryCast(Activator.CreateInstance(frmType), Form)
        Return TryCast(returnForm, Form)
    Catch ex As Exception
        Return Nothing
    End Try
End Function

要使用以上功能:

Dim MyForm = GetForm(FormLocation)
If MyForm IsNot Nothing Then
    MyForm.ShowDialog()
    'You can do any form manipulation from here.
Else
    MessageBox.Show($"{FormLocation} was not found.")
End If