当我单击Button时,我需要能够创建一个可以链接到不同Windows窗体的Button。但是,此Button是动态生成的,有时可以根据需要链接到不同的表单。例如:
我的按钮可以链接到FormA.vb或FormB.vb。我可以让Button创建String" FormA"或" FormB"必要时,但我不知道如何将FormA.vb或FormB.vb调用到屏幕上。
到目前为止,我一直在使用以下方法更改Windows窗体:
FormA.MdiParent = MainForm //My main form window
FormA.Show()
Me.Close()
但这显然无效:
"FormA".MdiParent = MainForm
"FormA".Show()
仅仅因为它们是字符串而不是类。
有没有办法让我的Button链接正确?
提前致谢。
答案 0 :(得分:3)
试试这个,您必须导入System.Windows.Forms
和System.Reflection
首先将表单名称输入strCreatedFromButton
然后找到它。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim strCreatedFromButton As String = "Form3"
Dim frm As New Form
frm = DirectCast(CreateObjectInstance(strCreatedFromButton), Form)
frm.Show()
End Sub
Public Function CreateObjectInstance(ByVal objectName As String) As Object
Dim obj As Object
Try
If objectName.LastIndexOf(".") = -1 Then
objectName = [Assembly].GetEntryAssembly.GetName.Name & "." & objectName
End If
obj = [Assembly].GetEntryAssembly.CreateInstance(objectName)
Catch ex As Exception
obj = Nothing
End Try
Return obj
End Function
答案 1 :(得分:2)
使用Form
类型变量存储FormA或FormB的引用。然后通过多态,您可以调用将执行适当实例方法的Show()
方法。例如:
Dim frm as Form
If <SomeCondition> Then
frm = New Form1()
Else
frm = New Form2()
End If
frm.Show()
这只是核心概念。您可以扩展它以满足您的确切需求。
阅读评论,我建议您只为现有表单编写一个大型交换机(Select Case
),然后为新表单添加新案例。您可以实现Factory design pattern将字符串(例如&#34; FormA&#34;)传递给Factory方法,并让工厂方法返回适当的子类对象(再次使用开关)。为了最大限度地减少部署工作,您可以将此Factory类和所有新表单类保存在单独的程序集中,该程序集将使用简单的xcopy部署。
如果您必须为将来的所有表单编写一次代码,那么Reflection是唯一可以执行此操作的方法。但是,我建议反对它。