表单名称来自变量。我想从变量值打开Form。
在VBA中,load(“ UserFormName”)将显示该表单。但是我不知道如何在VB.Net中做到这一点。
答案 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