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() { TreeNode rootNode = new TreeNode();
rootNode.Text = "DMS"; rootNode.Expand(); rootNode.ContextMenuStrip = this.RootNodeContextMenu; this.treeView1.Nodes.Add(rootNode);
GetVirtualNodes(rootNode);
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<int, TreeNode> virtualNodeDictionary = new Dictionary<int, TreeNode>();
try { SqlConnection connection = new SqlConnection(_connectionString);
connection.Open();
SqlCommand command = new SqlCommand("DMS.FileFolderTreeView", connection); command.CommandType = CommandType.StoredProcedure;
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);
SqlParameter result = new SqlParameter("@RETURN_VALUE", SqlDbType.Int); result.Direction = ParameterDirection.ReturnValue; command.Parameters.Add(result);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows) { if (reader.FieldCount >= 6) { while (reader.Read()) { if(!(virtualNodeDictionary.ContainsKey((int)reader["FolderID"]))) { DMSTreeNodeData folderNodeData = new DMSTreeNodeData((int)reader["FolderID"], DMSType.VirtualFolder); 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 { parentNode.Nodes.Add(folderNode); } virtualNodeDictionary.Add((int)reader["FolderID"], folderNode); }
if (reader["FileID"].ToString() != "") { DMSTreeNodeData fileNodeData = new DMSTreeNodeData((int)reader["FileID"], DMSType.VirtualFile);
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;
virtualNodeDictionary[(int)reader["FolderID"]].Nodes.Add(fileNode); } } } } reader.Close();
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<int, TreeNode> physicalNodeDictionary = new Dictionary<int, TreeNode>();
try { SqlConnection connection = new SqlConnection(_connectionString);
connection.Open();
SqlCommand command = new SqlCommand("DMS.FileFolderTreeView", connection);
command.CommandType = CommandType.StoredProcedure;
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);
SqlParameter result = new SqlParameter("@RETURN_VALUE", SqlDbType.Int); result.Direction = ParameterDirection.ReturnValue; command.Parameters.Add(result);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows) { if (reader.FieldCount >= 3) { while (reader.Read()) { if (!(physicalNodeDictionary.ContainsKey((int)reader["PhysicalFolderID"]))) { DMSTreeNodeData folderNodeData = new DMSTreeNodeData((int)reader["PhysicalFolderID"], DMSType.PhysicalFolder);
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 { parentNode.Nodes.Add(folderNode); } physicalNodeDictionary.Add((int)reader["PhysicalFolderID"], folderNode); }
if (reader["FileID"].ToString() != "") { DMSTreeNodeData fileNodeData = new DMSTreeNodeData((int)reader["FileID"], DMSType.PhysicalFile);
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;
physicalNodeDictionary[(int)reader["PhysicalFolderID"]].Nodes.Add(fileNode); } } } }
reader.Close();
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!