2016-06-07 64 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 

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