通过变量值打开表格

时间:2019-04-25 10:14:47

标签: vb.net vb.net-2010

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

在VBA中,load(“ UserFormName”)将显示该表单。但是我不知道如何在VB.Net中做到这一点。

3 个答案:

答案 0 :(得分:1)

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

创建vb.net winforms项目时,所有形式都可以用作“基”静态类。

您经常会看到很多代码,因此只需使用基本表单类即可。

如果我需要显示“ form2”,那么我真的不需要创建该表单的实例(除非您希望拥有该表单的多个实例。因此,大量的代码将简单地启动并使用“ base”静态”的形式。

例如:

Form2.Show()

我不认为这一切都是不好的做法,因为您认为在项目设置中“设置”启动表单的项目设置有什么作用?

它只是将内置实例“ mainForm” =设置为启动表单,并且不会创建新实例。

因此,既然我们都可以同意15年以上,那么在项目中设置启动表单的任何人都不会创建该表单的新实例,而是实际上使用基类实例。这确实是编程选择。

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

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()”。

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

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

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

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

因此,上面的代码片段显示了如何显示内置基类表单,而不必创建该表单的实例。

但是,我们加载的下两个表单是该表单的“新”实例,例如“字符串”。

因此,helper sub和helper函数将为您提供两种选择,以使您的喜好浮动。

答案 1 :(得分:0)

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()

答案 2 :(得分:0)

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

下面的代码从条目组合件的导出类型中获取表单类型,然后使用Activator.CreateInstance创建表单的新实例。然后,我在函数中返回该表格。

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