C#: this.Close() im Load der Form – Auf das verworfene Objekt kann nicht zugegriffen werden.

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.

One Response to C#: this.Close() im Load der Form – Auf das verworfene Objekt kann nicht zugegriffen werden.

  1.  

    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.

leave your comment


*

Unterstütze den Frickelblog!