我有一个程序,我们用它来运行不同的报告。根据所选的菜单选项,我打开基于菜单选项列出报告的相同表单。 (程序中也有不同的选项和功能,而不仅仅是一种形式)。
单击菜单选项时,我有以下代码
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 :(得分:0)
Form.Close
隐式调用Form.Dispose
因此,如果formName
是MdiChild
,它会被置于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
现在它可以根据需要运作。