在我的应用程序中,我必须在单击特定按钮/面板时显示许多表单。所以不要写
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
答案 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
FormManager
为Key=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
放到另一个地方。