2016-06-07 133 views
0

我有一个程序用于运行不同的报告。根据选择的菜单选项,我打开了基于菜单选项列出报告的相同表单。 (程序中也有不同的选项和功能,而不仅仅是一种形式)。vb.net打开表格时无法访问处置对象

点击的菜单选项时,我的代码

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. 

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

非常感谢

+0

你确定要使用'Me.MdiChildren'而不是'formName.MdiChildren'吗?尚未打开的表单不会有任何MDI儿童AFAIK。 –

+0

是_F_Select_Report_表单的实例还是表单的类名称? – Steve

+0

[文档](https://msdn.microsoft.com/en-us/library/system.windows.forms.form.close(v = vs.110).aspx)说,然后当你关闭一个窗体时,它会得到处置。这就是为什么它不能第二次工作。您应该保持打开窗体或创建一个新实例。 –

回答

0

Form.Close隐式调用Form.Dispose 所以如果formName是它被设置在For Each循环的MdiChild。 然后,在下一行中,您的代码尝试将其分配给其MdiParent属性,并出现错误。 所以你需要关闭MDI的儿童在这样的跳过它:

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

鉴于你的代码,我认为这是更好地展示本F_Select_Report形式之前关闭的孩子。即将For Each循环移至ReportsToolStripMenuItem1_Click处理程序的顶部。

0

不知道它是否是最好/最好的解决方案,但找到了解决方案。 而不是1 Sub都关闭所有打开的窗体,然后打开新窗体,我分裂出2 Subs。

关闭所有打开的那些

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 

现在,它的工作原理是必要的。

相关问题