在vb.net中使用公共函数显示新表单

时间:2017-01-25 12:57:15

标签: vb.net

在我的应用程序中,我必须在单击特定按钮/面板时显示许多表单。所以不要写

Frm = New formname
Frm.MdiParent = MDIParent
Frm.Show()

我希望有公共功能,我可以通过它传递表单名称。 因为我已经写了一个函数

Public Sub showForm(ByVal formname As Form)
        Frm = New formname
        Frm.MdiParent = MDIParent1
        Frm.Show()
    End Sub
Call showForm(myformname)

但问题是,它表示未定义formname

1 个答案:

答案 0 :(得分:3)

修改
我更新了我的答案,以反映您的评论,表格只能打开一次。

  

我想拥有公共功能,我可以通过该功能传递表单名称。   因为我已经写了一个函数

Public Sub showForm(ByVal formname As Form)

您不会将表单的名称传递给您的函数,而是传递Form类型的对象。

以下是一个可能的解决方案,其通用版本为showForm

Public Class FormManager
  Private _formByName As New Dictionary(Of String, Form)

  Public Sub showForm(Of T As {Form, New})(name As String, parent As Form)
      Dim frm As Form = Nothing
      If Not _formByName.TryGetValue(name, frm) OrElse _formByName(name).IsDisposed Then
          frm = New T()
          _formByName(name) = frm
      End If
      frm.MdiParent = parent
      frm.Show()
  End Sub
End Class

FormManagerKey=form name.所有打开的表单保存字典缓存。这是为了确保表单只打开一次。检查form.IsDisposed确保您可以关闭表单并重新打开它。

来自父表单的用法:

Public Class Form1
    Private fm = New FormManager()

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        fm.showForm(Of MyForm)("MyForm", Me)
    End Sub
End Class

第一个参数是识别表单名称。真正的魔法在类型T中,我们确保它是1)类型或子类型Form和2)它有一个无参数构造函数(MyForm只是这个例子的占位符放入你想要展示的真实形式的类型。

如果父参数不总是MDIParent1,那么它将为您带来额外的灵活性。如果您没有额外的灵活性,请将其移除。

您确定也可以放弃FormManager课程并将showForm放到另一个地方。