Diesmal geht es um diesen Fehler: „Auf das verworfene Objekt kann nicht zugegriffen werden.“
Diesen bekam ich, als ich in Load einer Form ein this.close() machen wollte.
Hier ein Schematisches Beispiel, welches ich vorhatte zu realisieren:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public partial class TestFenster : Form { bool CloseWindow = true; public HistoryFenster() { InitializeComponent(); } private void HistoryFenster_Load(object sender, EventArgs e) { if (_DictParams["action"] == "Aktion1") { //mache was, aber geh danach wieder zu } if (_DictParams["action"] == "Aktion2") { // Mache was, aber bleibe Offen CloseWindow = false; } #region VSSAfterCheckin if (_DictParams["action"] == "Aktion3") { //mache was, aber geh danach wieder zu } // Fenster Schliessen? if (CloseWindow) { this.Close(); } } } |
Man beachte: Nur bei „Aktion2“ wird der Bool „Closewindow“ auf false gesetzt.
Bei den anderen beiden Aktionen bleibt er true, somit soll das Fenster bei diesen beiden Aktionen geschlossen werden.
Führt man dies nun aus, bekommt man oben beschriebenen Fehler, da versucht wird auf das Form zuzugreifen, obwohl es durch das Close() schon nicht mehr Existiert.
Möchte man nun trotzdem die Anwendung Beenden, sobald im load schon bestimmte vorraussetzungen zutrafen, so würde dies mit einem Application.Exit() statt dem this.Close() funktionieren:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public partial class TestFenster : Form { bool CloseWindow = true; public HistoryFenster() { InitializeComponent(); } private void HistoryFenster_Load(object sender, EventArgs e) { if (_DictParams["action"] == "Aktion1") { //mache was, aber geh danach wieder zu } if (_DictParams["action"] == "Aktion2") { // Mache was, aber bleibe Offen CloseWindow = false; } #region VSSAfterCheckin if (_DictParams["action"] == "Aktion3") { //mache was, aber geh danach wieder zu } // Fenster Schliessen? if (CloseWindow) { Application.Exit(); } } } |
Damit schießt sich sowohl das Formular, als auch die Anwendung.
Netter Beitrag. Allerdings muss eine kleine Korrektur bzw. Verbesserung anbringen. Der gravierende Unterschied zwischen this.Close() und Application.Exit() besteht darin, dass mit der einen Methode eine Form geschlossen wird und mit der anderen die Anwendung beendet wird.
Besser wäre stattdessen eine Lösung, dass die entsprechenden Parameter bereits vor dem Erstellen der Form ausgewertet werden, damit die Form dann gar nicht erst erstellt wird, wenn sie nicht benötigt wird. Gerade bei großen Anwendungen ist das Anlegen von unbenötigten Objekten der größte Performance-Killer.
Ich habe dazu auch in meinem Blog einen kleinen Beitrag geschrieben: http://www.hofmann-robert.info/?p=384
Ansonsten großes Lob zu diesem Blog. Hab schon einige für mich interessante Themen hier gefunden.