0

我的项目有问题,我有 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再次打电话时,我得到了一些错误虱子图片波纹管

在此处输入图像描述

我希望有人能帮助我:(

4

4 回答 4

2

您正在尝试使用单例模式,但您做得并不完美。可以多次创建 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 上很好,只能有一个父级,当它关闭时,程序无论如何都会终止。但同样的规则不适用于儿童。将子实例管理代码移动到父类,那是它所属的地方。

于 2013-05-03T10:30:38.863 回答
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
于 2013-05-03T09:31:38.633 回答
0

与其尝试显示已处理的表单,不如每次创建一个新表单。

Dim newForm as New frmDaftarBarang
newForm.Show()
于 2013-05-03T10:25:32.713 回答
0

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

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

于 2019-09-05T08:03:01.390 回答