无法访问实例VB.net中的已处置对象

时间:2013-05-03 09:26:39

标签: vb.net

我的项目有问题,我有2个表单,1个表单带有MDI container = true,1个表单是子表单。 我有父代表格的代码,如下所示

   Public Class frmInduk
    Dim afrmDaftarBarang As frmDaftarBarang = frmDaftarBarang.instance
    Private Sub DataBarangToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataBarangToolStripMenuItem.Click

        With afrmDaftarBarang
            .MdiParent = Me
            'Dim afrmDaftarBarang As frmDaftarBarang = frmDaftarBarang.instance
            .Show()
            .Focus()

        End With
    End Sub
End Class

而且,在我的孩子表格中,我有如下代码

Public Class frmDaftarBarang
Private Shared anInstance As frmDaftarBarang
Public Shared ReadOnly Property instance() As frmDaftarBarang
    Get
        If anInstance Is Nothing Then
            anInstance = New frmDaftarBarang

        End If
        Return anInstance

    End Get
End Property

End Class

当我运行这个项目时,没问题。我的项目可以很好地运行。但是,当我打电话给frmDataBarang,然后我关闭,但是当我再次打电话给frmDataBarang时,真空来了 我得到一些错误虱子图片吼叫

enter image description here

我希望有人可以帮助我:(

4 个答案:

答案 0 :(得分:2)

您正在尝试使用Singleton模式,但您做得不完美。可以多次创建MDI子窗体,当它被销毁时,您必须将单例实例设置回Nothing。使用FormClosing事件执行此操作:

Protected Overrides Sub OnFormClosed(ByVal e As FormClosedEventArgs)
    anInstance = Nothing
    MyBase.OnFormClosed(e)
End Sub

当再次显示现有实例时,您还需要做一些合理的事情。它可能不是正确的状态。此代码确实属于MDI父级,但您可以随意使用:

    Get
        If anInstance Is Nothing Then
            anInstance = New frmDaftarBarang
        Else
            If anInstance.WindowState = FormWindowState.Minimized Then
                anInstance.WindowState = FormWindowState.Normal
            End If
        End If
        Return anInstance

请注意,当您使用单例执行除子激活之外的操作时,这会变得很难看。使用该模式确实是一个坏主意。你的MdiParent很好,只能有一个父母,当它关闭时,程序终止。但这些规则并不适用于儿童。将子实例管理代码移动到父类,即它所属的位置。

答案 1 :(得分:1)

当您第二次调用类时,实例不是Nothing,因为它仍然存在,处于已处置状态。您必须添加一个检查以查看它是否已被处置。

这可能有效:

Public Class frmDaftarBarang
Private Shared anInstance As frmDaftarBarang
Public Shared ReadOnly Property instance() As frmDaftarBarang
    Get
        If anInstance Is Nothing OrElse anInstance.IsDisposed Then
            anInstance = New frmDaftarBarang

        End If
        Return anInstance

    End Get
End Property

End Class

答案 2 :(得分:0)

不是试图显示已处理的表单,而是每次都创建一个新表单。

Dim newForm as New frmDaftarBarang
newForm.Show()

答案 3 :(得分:0)

如果您要调用的表单导致异常,则可能会发生这种情况。

在这种情况下,请修复表单加载中的所有错误并以您正在调用的表单显示事件。