[SOLVED] Fehler beim Schließen des Programms



  • Hallo.

    Ich habe ein Programm mit einem TreeView-Steuerelement. Wenn ich das Programm schließe, erhalte ich eine Fehlermeldung. Die von mir definierte Funktion "Refresh_TreeView()" wird dabei nochmal ausgeführt. In dieser Funktion wird der komplette TreeView neu gezeichnet. Da beim neu Zeichnen die Unterpunkte stets ausgebledent werden (Stichwort: Expand bzw. IsExpanded), speicher ich mir vorher ab, wie das vor dem Neuzeichnen ausgesehen hat.

    Also, in den Zeilen 12 bis 18 wird der Wert der Eigenschaft IsExpanded gespeichert.
    In den Zeilen 80 bis 85 wird, wenn der Wert True ist, die Methode "Expand" ausgeführt.

    Ich schreibe mal den Code hin - aber der Fehler tritt "zum Glück" recht früh (Zeile 12) auf, denn das ganze ist natürlich nicht mehr so übersichtlich.

    Die Fehlermeldung lautet: "Ein Ausnahmefehler des Typs "System.ObjectDisposedException" ist in System.Windows.Forms.dll aufgetreten." und wird in Zeile 12 verursacht.

    Klar, ich könnte das jetzt mit try{}catch{} umgehen, aber ich will diese Strategie nicht nutzen um Programmierfehler auszumerzen... das halte ich für etwas unseriös.

    Nachdem das Programm im Debugger stoppt, kann ich sehen, welche Eigenschaften der Klasse TreeView diese Ausnahme ausgeben. Folgende sind betroffen:
    - Bounds
    - IsExpanded
    - IsSelected
    - IsVisible
    und noch einige weitere.

    Die Eigenschaft "Text" beispielsweise enthält noch den korrekten Wert, weshalb man sicher sein kann, dass der TreeNode, welcher hier überprüft wird, noch existiert. MeshMainNode.Node.Count ist größer 0.

    Anbei der Code:

    public static void ReDrawTreeView()
            {
                /*Define fonts*/
                Font Level1Font = new Font("Arial", 10);
                Font Level2Font = new Font("Arial", 10);
                Font Level3Font = new Font("Arial", 10);
                Font Level4Font = new Font("Arial", 8);
    
                TreeNode node = null;
                TreeNode Snode1 = null, Snode2 = null;
    
                if (MeshMainNode != null) { MeshExpanded = MeshMainNode.IsExpanded; } //Fehler tritt hier auf...
                if (FamilyMainNode != null) { FamilyExpanded = FamilyMainNode.IsExpanded; }
                if (VariableMainNode != null) { VariableExpanded = VariableMainNode.IsExpanded; }
                if (EquationMainNode != null) { EquationExpanded = EquationMainNode.IsExpanded; }
                if (IntFamilyMainNode != null) { IntFamilyExpanded = IntFamilyMainNode.IsExpanded; }
                if (ExtFamilyMainNode != null) { ExtFamilyExpanded = ExtFamilyMainNode.IsExpanded; }
                if (GlobalVariables._pMesh.Count > 0) { CMeshHandle.UpdateMeshList(); foreach (CMesh M in GlobalVariables._pMesh) { if (M.MeshTreeNode != null && M.ShellTreeNode != null) { M.Expanded = M.MeshTreeNode.IsExpanded; M.ExpandedShell = M.ShellTreeNode.IsExpanded; } } }
    
                MainTV.Nodes.Clear();
                MainTV.CheckBoxes = false;
    
                //Setting Mesh mainnode
                if (GlobalVariables._pMesh.Count > 0)
                {
                    MeshMainNode = MainTV.Nodes.Add("Mesh");
                    FamilyMainNode = MainTV.Nodes.Add("Family");
                    IntFamilyMainNode = FamilyMainNode.Nodes.Add("Internal");
                    ExtFamilyMainNode = FamilyMainNode.Nodes.Add("External");
                    VariableMainNode = MainTV.Nodes.Add("Variable");
                    EquationMainNode = MainTV.Nodes.Add("Equation");
    
                    MeshMainNode.NodeFont = Level1Font;
                    FamilyMainNode.NodeFont = Level1Font;
                    VariableMainNode.NodeFont = Level1Font;
                    EquationMainNode.NodeFont = Level1Font;
                    IntFamilyMainNode.NodeFont = Level2Font;
                    ExtFamilyMainNode.NodeFont = Level2Font;
    
                    MeshMainNode.Checked = true;
                    FamilyMainNode.Checked = true;
                    VariableMainNode.Checked = true;
                    EquationMainNode.Checked = false;
    
                    foreach (CMesh M in GlobalVariables._pMesh)
                    {
                        /*Set mesh*/
                        M.MeshTreeNode = MeshMainNode.Nodes.Add(M.Name);
                        M.MeshTreeNode.NodeFont = Level2Font;
                        M.MeshTreeNode.Checked = M.StatusDisplayMesh();
                        if (M.nNode > 0) { M.NodeTreeNode = M.MeshTreeNode.Nodes.Add("node"); M.NodeTreeNode.NodeFont = Level3Font; }
                        if (M.nLineElement > 0) { M.LineTreeNode = M.MeshTreeNode.Nodes.Add("line"); M.LineTreeNode.NodeFont = Level3Font; }
                        if (M.nAreaElement > 0)
                        {
                            M.ShellTreeNode = M.MeshTreeNode.Nodes.Add("shell"); M.ShellTreeNode.NodeFont = Level3Font;
                            if (M.nTri > 0) { Snode2 = M.ShellTreeNode.Nodes.Add("tri_3"); Snode2.NodeFont = Level4Font; }
                            if (M.nQuad > 0) { Snode2 = M.ShellTreeNode.Nodes.Add("quad_4"); Snode2.NodeFont = Level4Font; }
                            if (M.nPolygon > 0) { Snode2 = M.ShellTreeNode.Nodes.Add("poly_n"); Snode2.NodeFont = Level4Font; }
                        }
    
                        if (M.nIntFamily > 0)
                        {
                            for (int fi = 0; fi < M.nIntFamily; fi++) { Snode1 = IntFamilyMainNode.Nodes.Add(M.IntFamily[fi].Name); Snode1.NodeFont = Level3Font; }
                        }
    
                        if (M.nExtFamily > 0)
                        {
                            for (int fi = 0; fi < M.nExtFamily; fi++) { Snode1 = ExtFamilyMainNode.Nodes.Add(M.ExtFamily[fi].Name); Snode1.NodeFont = Level3Font; }
                        }
    
                        if (M.Expanded) { M.MeshTreeNode.Expand(); }
                        if (M.ExpandedShell) { M.ShellTreeNode.Expand(); }
                    }
    
                    foreach (CVariable V in GlobalVariables._pVariable) { node = VariableMainNode.Nodes.Add(V.Name); }
                    foreach (CEquation E in GlobalVariables._pEquation) { node = EquationMainNode.Nodes.Add(E.Name);}
    
                    if (MeshExpanded) { MeshMainNode.Expand(); }
                    if (FamilyExpanded) { FamilyMainNode.Expand(); }
                    if (IntFamilyExpanded) { IntFamilyMainNode.Expand(); }
                    if (ExtFamilyExpanded) { ExtFamilyMainNode.Expand(); }
                    if (VariableExpanded) { VariableMainNode.Expand(); }
                    if (EquationExpanded) { EquationMainNode.Expand(); }
                }
            }
    


  • Anscheinend greifst du auf das TreeView-Element noch mal zu, nachdem es schon disposed wurde.
    Du kannst dies mittels Control.IsDisposed überprüfen:

    if (MainTV.IsDisposed)
       return;
    
    // ...
    


  • ... hatte noch wo anders einen Bug, so dass sich das jetzt erledigt hat. Aber der Tip ist trotzdem sehr nützlich zum Abfange des Schließens des Programms.

    Vielen Dank.


Log in to reply