Entwickler-Ecke

WinForms - TreeView-nach LabelEdit werden mehrere Nodes umbenannt


fellfresse - Di 19.08.08 08:11
Titel: TreeView-nach LabelEdit werden mehrere Nodes umbenannt
aber das nur im TreeView...

Hallo,

ich habe eine komisches Problem mit meinem TreeView Control.
Ich habe eine Methode FillTreeView. Dies ruft wiederum 2 Methoden auf die aus der DB Nodes ins TreeView hängen.
Durch eine AfterLabelEdit Ereigniss können die Nodes umbenannt werden. Die Änderungen werden auch korrekt in die DB geschrieben.
Nach der Änderung muss der TreeView neu eingelesen werden. Und hier kommt es zu einem Darstellungsproblem. Nicht nur der umbenannte Node erhält den neuen Namen, sondern auch der Node, der vor diesem in den TreeView eingehängt wurde, obwohl die Daten aus der DB richtig kommen.

Laut Debugger ist im Speicher auch alles i.O.

Das ist so ein komisches Verhalten, das ich nicht mal weiss, wonach ich Googlen kann um eine Lösung zu finden.

Kann mir hier jemand helfen?

Ist das schon mal beobachtet worden das Verhalten?

Danke


Christian S. - Di 19.08.08 09:40

Hallo!

Ohne Deinen Quellcode zu kennen, dürfte es schwer werden, das Problem zu finden.

Allerdings ist mir nicht klar, warum bei Änderung eines einzigen Knotens, die Treeview komplett neu eingelesen werden muss. Das erscheint mir sehr ineffizient :gruebel:

Grüße
Christian


fellfresse - Di 19.08.08 10:12

Der TreeView wird neu eingelesen, da der TreeView mit der DB verbunden ist. Ausserdem arbeite ich auf der DB ja nicht alleine. Wenn ein anderer an dem Baum etwas in der Zwischenzeit etwas ändert, dann brauche ich den aktuellen Stand der DB.

na hier mal Code (es ist ziemlich viel, deswegen selektiere ich mal):

die Ausgangsfkt, die den Baum füllt und die 2 Methode aufruft, die den Baum füllen

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void FillTreeView()
{
    // RootNode erzeugen
    TreeNode rootNode = new TreeNode();

    // RootNode konfigurieren
    rootNode.Text = "DMS";    
    rootNode.Expand();
    rootNode.ContextMenuStrip = this.RootNodeContextMenu;
                        
    // RootNode in TreeView einhängen
    this.treeView1.Nodes.Add(rootNode);

    // Methode zum einlesen aller virtuellen Ordner und Dateien
    GetVirtualNodes(rootNode);

    // Methode zum einlesen aller physischen Ordner und Dateien
    GetPhysicalNodes(rootNode);
}


Methode: GetVirtualNodes (Nodes die nur in der DB verwaltet werden

C#-Quelltext
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:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
private void GetVirtualNodes(TreeNode parentNode)
{
    // Dictionary zur Speicherung der TreeViewNodes
    Dictionary<int, TreeNode> virtualNodeDictionary = new Dictionary<int, TreeNode>();

    try
    {
        // Verbindung initialisieren
        SqlConnection connection = new SqlConnection(_connectionString);

        // Verbindung herstellen
        connection.Open();

        // Stored Procedure aufrufen
        SqlCommand command = new SqlCommand("DMS.FileFolderTreeView", connection);
        command.CommandType = CommandType.StoredProcedure;

        // Parameter hinzufügen
        SqlParameter isVirtual = new SqlParameter("@IsVirtual", SqlDbType.Bit);
        isVirtual.Direction = ParameterDirection.Input;
        isVirtual.Value = true;
        command.Parameters.Add(isVirtual);
                
        SqlParameter errorText = new SqlParameter("@ErrorText", SqlDbType.NVarChar, 4000);
        errorText.Direction = ParameterDirection.Output;
        command.Parameters.Add(errorText);

        // Fehlercode
        SqlParameter result = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
        result.Direction = ParameterDirection.ReturnValue;
        command.Parameters.Add(result);

        // Daten laden...
        SqlDataReader reader = command.ExecuteReader();

        if (reader.HasRows) // hat die Abfrage ein Ergebniss geliefert
        {
            if (reader.FieldCount >= 6// mit der richtigen Anzahl an Spalten
            {
                 while (reader.Read()) // Ergebniss durchlaufen
                 {
                     if(!(virtualNodeDictionary.ContainsKey((int)reader["FolderID"]))) // wenn die FolderID noch nicht aufgetreten ist
                     {
                         // DMSTreeNodeData Object erstellen, dass alle Daten zu dem Node enthält
                         DMSTreeNodeData folderNodeData = new DMSTreeNodeData((int)reader["FolderID"], DMSType.VirtualFolder);
                                
                         // folderNode erzeugen und konfigurieren
                         TreeNode folderNode = new TreeNode();

                         folderNode.Text = reader["Folder"].ToString();
                         folderNode.Tag = folderNodeData;
                         folderNode.ImageIndex = 0;
                         folderNode.SelectedImageIndex = 1;
                         folderNode.ContextMenuStrip = this.FolderNodeContextMenu;

                         if (reader["ParentID"] != null
                                    && reader["ParentID"] != DBNull.Value
                                    && virtualNodeDictionary.ContainsKey((int)reader["ParentID"]))
                         {
                             virtualNodeDictionary[(int)reader["ParentID"]].Nodes.Add(folderNode);
                         }
                         else
                         {
                             // folderNode an den TreeView hängen
                             parentNode.Nodes.Add(folderNode);
                         }
                         virtualNodeDictionary.Add((int)reader["FolderID"], folderNode);
                     }
  

                     // wenn in der Zeile eine Datei geliefert wird
                     if (reader["FileID"].ToString() != "")
                     {
                          // DMSTreeNodeData Object erstellen, dass alle Daten zu dem Node enthält
                          DMSTreeNodeData fileNodeData = new DMSTreeNodeData((int)reader["FileID"], DMSType.VirtualFile);

                          // FileNode erzeugen und konfigurieren
                          TreeNode fileNode = new TreeNode();

                          if (!String.IsNullOrEmpty(reader["AltFileName"].ToString()))
                              fileNode.Text = reader["AltFileName"].ToString();
                          else
                              fileNode.Text = reader["Name"].ToString();
                          fileNode.Tag = fileNodeData;
                          fileNode.ImageIndex = 2;
                          fileNode.SelectedImageIndex = 2;
                          fileNode.ContextMenuStrip = this.fileContextMenu;

                          // FileNode an den richtigen Knoten im Dictionary hängen
                          virtualNodeDictionary[(int)reader["FolderID"]].Nodes.Add(fileNode);
                      }
                  }
              }
          }
                
          // Reader beenden
          reader.Close();

          // SQL Verbindung beenden
          connection.Close();

      }
      catch (Exception e)
      {
          String errorMsg = "Get Virtual TreeNodes: " + e.ToString();
          _log.Error(errorMsg);
      }                 
  }


Methode: GetPhysicalNodes (Nodes die auch im Dateisystem verwaltet werden

C#-Quelltext
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:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
private void GetPhysicalNodes(TreeNode parentNode)
{
    // Dictionary zur Speicherung der TreeViewNodes
    Dictionary<int, TreeNode> physicalNodeDictionary = new Dictionary<int, TreeNode>();

    try
    {
        // Verbindung initialisieren
        SqlConnection connection = new SqlConnection(_connectionString);

        // Verbindung herstellen
        connection.Open();

        // Stored Procedure aufrufen
        SqlCommand command = new SqlCommand("DMS.FileFolderTreeView", connection);

        // explizites mitteilen, dass das Kommando eine Stored Procedure ist
        command.CommandType = CommandType.StoredProcedure;

        //// Parameter hinzufügen
        SqlParameter isVirtual = new SqlParameter("@IsVirtual", SqlDbType.Bit);
        isVirtual.Direction = ParameterDirection.Input;
        isVirtual.Value = false;
        command.Parameters.Add(isVirtual);

        SqlParameter errorText = new SqlParameter("@ErrorText", SqlDbType.NVarChar, 4000);
        errorText.Direction = ParameterDirection.Output;
        command.Parameters.Add(errorText);

        // Fehlercode
        SqlParameter result = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
        result.Direction = ParameterDirection.ReturnValue;
        command.Parameters.Add(result);

        // Daten laden...
        SqlDataReader reader = command.ExecuteReader();

        if (reader.HasRows) // hat die Abfrage ein Ergebniss geliefert
        {
            if (reader.FieldCount >= 3// mit der richtigen Anzahl an Spalten
            {
                while (reader.Read()) // Ergebniss durchlaufen
                {
                    if (!(physicalNodeDictionary.ContainsKey((int)reader["PhysicalFolderID"]))) // wenn die FolderID noch nicht aufgetreten ist
                    {
                        // DMSTreeNodeData Object erstellen, dass alle Daten zu dem Node enthält
                        DMSTreeNodeData folderNodeData = new DMSTreeNodeData((int)reader["PhysicalFolderID"], DMSType.PhysicalFolder);

                        // folderNode erzeugen und konfigurieren
                        TreeNode folderNode = new TreeNode();

                        folderNode.Text = reader["FolderName"].ToString();
                        folderNode.Tag = folderNodeData;
                        folderNode.ImageIndex = 0;
                        folderNode.SelectedImageIndex = 1;
                        folderNode.ContextMenuStrip = this.FolderNodeContextMenu;

                        if (reader["ParentID"] != null
                                    && reader["ParentID"] != DBNull.Value
                                    && physicalNodeDictionary.ContainsKey((int)reader["ParentID"]))
                        {
                            physicalNodeDictionary[(int)reader["ParentID"]].Nodes.Add(folderNode);
                        }
                        else
                        {
                            // folderNode an den TreeView hängen
                            parentNode.Nodes.Add(folderNode);
                        }
                        physicalNodeDictionary.Add((int)reader["PhysicalFolderID"], folderNode);
                    }


                    // wenn in der Zeile eine Datei geliefert wird
                    if (reader["FileID"].ToString() != "")
                    {
                        // DMSTreeNodeData Object erstellen, dass alle Daten zu dem Node enthält
                        DMSTreeNodeData fileNodeData = new DMSTreeNodeData((int)reader["FileID"], DMSType.PhysicalFile);

                        // FileNode erzeugen und konfigurieren
                        TreeNode fileNode = new TreeNode();

                        if (!String.IsNullOrEmpty(reader["AltFileName"].ToString()))
                            fileNode.Text = reader["AltFileName"].ToString();
                        else
                            fileNode.Text = reader["Name"].ToString();
                        fileNode.Tag = fileNodeData;
                        fileNode.ImageIndex = 2;
                        fileNode.SelectedImageIndex = 2;
                        fileNode.ContextMenuStrip = this.fileContextMenu;

                        // FileNode an den richtigen Knoten im Dictionary hängen
                        physicalNodeDictionary[(int)reader["PhysicalFolderID"]].Nodes.Add(fileNode);
                    }
                }
            }
        }

        // Reader beenden
        reader.Close();

        // SQL Verbindung beenden
        connection.Close();

    }
    catch (Exception e)
    {
        String errorMsg = "Get Physical Nodes: " + e.ToString();
        _log.Error(errorMsg);
    }                   
}

Ich hoffe das hilft weiter, obwohl das sehr viel ist?!?!


Susanne - Fr 13.09.13 12:45

Hallo.

Gab es eine Lösung zu diesem Problem?

Lieber Gruss
Susanne