动态创建表单的实例并显示它

时间:2015-10-29 07:40:51

标签: vb.net winforms

我创建了一个词典:

i

以下是我的模块函数,用于在MDIParent中显示一个表单:

Public DicForms As New Dictionary(Of String, Form)
DicForms.Add("FrmAbout", FrmAbout)
DicForms.Add("FrmAddAcGroup", FrmAddAcGroup)
'..
'..
'upto 71 items

我正在尝试打开字典Public Sub OpenForm(ByVal frm As Form) With frm .MdiParent = FrmMain .Show() .Focus() End With End Sub 中提供的表单:

DicForms

如果表单第一次打开,它会显示。但是当打开相同的表单时,例如当我第一次尝试打开'FormName = "FrmAbout" If Not formName Is Nothing Then If DicForms.ContainsKey(formName) Then Dim fmr As New Form fmr = DicForms.Item(formName) OpenForm(DicForms.Item(formName)) End If End If 时,它会显示但是第二次出现错误:

FrmAbout

到目前为止我做了什么:

Cannot access a disposed object. Object name: 'FrmAbout'

但这并没有像我预期的那样发挥作用:它显示出同样的错误。

1 个答案:

答案 0 :(得分:2)

您有两种选择:

一:当你想要显示它时,创建一个新的表单实例。不要创建String, FormString, Type的字典,并且每次都使用Activator.CreateInstance创建新的实例:

If Not formName Is Nothing Then
    If DicForms.ContainsKey(formName) Then
       Dim fmrType = DicForms.Item(formName)
        Dim frm = Directcast(Activator.CreateInstance(fmrType), Form)
        OpenForm(frm)
    End If
End If

二:处理表单的结束事件,并隐藏它们而不是关闭它们。通过这种方式,您可以再次显示它们,因为它们不会被处理掉。