使用其名称作为String调用单独的Windows窗体

时间:2014-10-21 02:52:14

标签: vb.net

当我单击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链接正确?

提前致谢。

2 个答案:

答案 0 :(得分:3)

试试这个,您必须导入System.Windows.FormsSystem.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是唯一可以执行此操作的方法。但是,我建议反对它。