Problem nach Entladen einer Form - System.ObjectDisposedException

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von binbaden.

    Problem nach Entladen einer Form - System.ObjectDisposedException

    Hallo zusammen,

    mein Programm besteht aus 2 Forms, frmMain und frmExplorer. Auf frmMain ist ein Button mit frmExplorer.Show(), mit dem die Ordner und Dateien eines bestimmten Laufwerks angezeigt werden sollen. Ich habe das Code-Beispiel auf das allernötigste beschränkt.

    Das ganze funktioniert super, wenn man frmExplorer zum ersten mal öffnet. Wenn man frmExplorer aber schließt und wieder öffnet, tritt ein unschöner Fehler bei SendMessage auf: "System.ObjectDisposedException: Auf das verworfene Objekt kann nicht zugegrffen werden."

    Das Problem tritt allerdings nicht auf, wenn man frmExplorer mit der ShowDialog-Methode öffnet, aber leider passt das modale Fenster überhaupt nicht zum Bedienkonzept (frmMain soll immer hinten bleiben).

    Ich vermute, dass ich hier etwas wesentliches nicht beachtet habe. Mit Form.Dispose() sollten doch alle Ressourcen der Form, also auch Listview1, freigegeben werden?

    :?: :!: :?:


    VB.NET-Quellcode

    1. Private Sub cmdSchliessen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSchliessen.Click
    2. Me.Dispose()
    3. End Sub
    4. Private Sub Update_LV(ByVal sDirectory As String)
    5. Try
    6. ListView1.Items.Clear()
    7. For Each fDirs As String In IO.Directory.GetDirectories(sDirectory)
    8. ' ListView1 mit Verzeichnissen füllen...
    9. Next
    10. For Each file As String In IO.Directory.GetFiles(sDirectory)
    11. ' ListView1 mit Dateien füllen...
    12. Next
    13. '### Hier tritt der Fehler auf:
    14. SendMessage(ListView1.Handle, WM_LBUTTONUP, 1&, 0&)
    15. Catch ex As Exception
    16. MsgBox(ex.ToString)
    17. End Try
    18. End Sub


    Vielen Dank!
    Burkhard
    mit dispose werden die ressourcen nicht "freigegeben", sondern die instanzen aus dem speicher gelöscht, können also nicht mehr verwendet werden. d.h. wenn du die 2. form beim schließen disposed und beim nächsten öffnen du wieder z.b. etwas mit listview1 anstellen willst ->"System.ObjectDisposedException: Auf das verworfene Objekt kann nicht zugegrffen werden."
    entweder lass das dispose weg oder - wie es eigentlich eh sauberer wäre - öffne immer eine neu instanz der form2
    Wenn Du die 2. Form mit Hide() unsichtbar machst statt Dispose() hast Du das Problem nicht.
    Außerdem kanst Du abfragen:
    If (frm2 Is Nothing OrElse frm2.IsDisposed) Then
    ' Form wieder erstellen und anzeigen
    End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erstmal vielen Dank für die beiden Antworten. Leider tritt das Problem auch mit einer neuen Instanz auf:

    VB.NET-Quellcode

    1. Private Sub cmdExplorer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExplorer.Click
    2. Dim oExplorer As New frmExplorer
    3. oExplorer.Show()
    4. End Sub


    Mit Me.Hide (auf der 2. Form) und nachfolgendem frmExplorer.Show, tritt das Problem nicht auf. Es wäre natürlich schon, wenn man wüsste, was da genau vor sich geht. Es scheint ja auch nur den Unmanaged Code zu betreffen.

    Gruß
    Burkhard
    Das geht natürlich schief.
    Mach es so:

    VB.NET-Quellcode

    1. Private oExplorer As frmExplorer = Nothing
    2. Private Sub cmdExplorer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExplorer.Click
    3. If(oExplorer Is Nothing OrElse oExplorer.IsDisposed) Then
    4. oExplorer = New frmExplorer
    5. End If
    6. oExplorer.Show()
    7. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Leider geht es auch nicht, wenn ich es genau so mache. Es liegt möglicherweise auch an anderer Stelle des recht umfangreichen Codes von frmExplorer verborgen.

    ;( Es wurmt mich zwar, es nicht zu verstehen, aber erstmal umgehe ich das Problem mit Form.Hide.

    Vielen Dank nochmal!
    Burkhard