打开表单时,vb.net无法访问已处置的对象

时间:2016-06-07 14:43:09

标签: vb.net forms objectdisposedexception

我有一个程序,我们用它来运行不同的报告。根据所选的菜单选项,我打开基于菜单选项列出报告的相同表单。 (程序中也有不同的选项和功能,而不仅仅是一种形式)。

单击菜单选项时,我有以下代码

Private Sub ReportsToolStripMenuItem1_Click(sender As Object, e As     EventArgs) Handles ReportsToolStripMenuItem1.Click
    FormLocation = "F_Legal"
    FormName = "Legal"
    PrepareForm(F_Select_Report)
End Sub 'ReportsToolStripMenuItem1_Click

F_Select_Report表格是打开的。

Private Sub PrepareForm(formName As Form)
    Cursor = Cursors.WaitCursor
    For Each Form In Me.MdiChildren
        Form.Close()
    Next

    formName.MdiParent = Me
    formName.Height = Me.Height
    formName.Width = Me.Width
    formName.Show()
    Cursor = Cursors.Arrow
End Sub 'PrepareForm

调用此位,关闭所有其他打开的表单,然后打开调用的表单。

这是我第一次尝试打开表单时工作正常,但在第二次尝试时,我收到一条错误消息说

Cannot access a disposed object.

然后在第三次尝试时,它再次打开表单。 我该如何解决这个问题?

非常感谢

2 个答案:

答案 0 :(得分:0)

Form.Close隐式调用Form.Dispose 因此,如果formNameMdiChild,它会被置于For Each循环中。 然后,在下一行,您的代码尝试分配给它的MdiParent属性,并在那里发生错误。 所以你需要在关闭这样的MDI孩子时跳过它:

For Each Form In Me.MdiChildren
    If Not Form Is formName Then Form.Close
Next

鉴于您的代码,我认为在显示F_Select_Report表单之前关闭孩子会更好。即将For Each循环原样移动到ReportsToolStripMenuItem1_Click处理程序的顶部。

答案 1 :(得分:0)

不确定它是否是最好/最好的解决方案,但找到了解决方案。 而不是1 Sub同时关闭所有打开的表单,然后打开新的表单,我将它拆分为2个子。

关闭所有打开的

Private Sub CloseAllForms()
    For Each Form In Me.MdiChildren
        Form.Close()
    Next
End Sub 'CloseAllForms

然后打开新表单

Private Sub PrepareForm(formName As Form)
    Cursor = Cursors.WaitCursor
    Try
        formName.MdiParent = Me
        formName.Height = Me.Height
        formName.Width = Me.Width
        formName.Show()
    Catch ex As Exception
        MessageBox.Show("Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
    Cursor = Cursors.Arrow
End Sub 'PrepareForm

现在它可以根据需要运作。