Treeview的Node拖动Node节点位置移动并重新排序存储。
关键代码:
- private void treeView1_DragDrop(object sender, DragEventArgs e)//拖动
- {
- //获得拖放中的节点
- TreeNode moveNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
- /* 根据鼠标坐标确定要移动到的目标节点 */
- Point pt;
- TreeNode targeNode;
- pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
- targeNode = this.treeView1.GetNodeAt(pt);
- TreeNode newMoveNode = (TreeNode)moveNode.Clone();
- bool isNeedToSort = false;
- /* 要移动及目标node为根节点,添加到根同级;否则放到本结点同级*/
- if (targeNode.Parent == null && this.mHTRootItem.ContainsKey(moveNode.Name))
- {
- treeView1.Nodes.Insert(targeNode.Index, newMoveNode);
- treeView1.SelectedNode = newMoveNode;
- moveNode.Remove();
- isNeedToSort = true;
- }
- /* 目标节点为非根节点且*/
- else if(targeNode.Parent != null && this.mHTItemChild.ContainsKey(targeNode.Name))
- {
- string parentFlagKey = string.Empty;
- Structs.ItemChild childNodeSrc = (Structs.ItemChild)this.mHTItemChild[moveNode.Name];
- Structs.ItemChild childNodeDest = (Structs.ItemChild)this.mHTItemChild[targeNode.Name];
- if (childNodeDest.ParentFlagKey == childNodeSrc.ParentFlagKey)
- {
- targeNode.Parent.Nodes.Insert(targeNode.Index, newMoveNode);
- treeView1.SelectedNode = newMoveNode;
- moveNode.Remove();
- isNeedToSort = true;
- }
- }
- targeNode.Expand();
- if (!isNeedToSort)
- return;
- /* Resort the field of sequence */
- string flagKey = string.Empty;
- if (targeNode.Parent == null) // Root Node
- {
- Structs.ItemRoot root;
- for (int i = 0; i treeView1.Nodes.Count; i++)
- {
- flagKey = treeView1.Nodes[i].Name;
- root = (Structs.ItemRoot)this.mHTRootItem[flagKey];
- root.Sequence = i;
- this.mHTRootItem.Remove(flagKey);
- DBOperator.UpdateItemRoot(root);
- this.mHTRootItem.Add(flagKey, root);
- }
- }
- else
- {
- Structs.ItemChild child;
- for (int i = 0; i targeNode.Parent.Nodes.Count; i++)
- {
- flagKey = targeNode.Parent.Nodes[i].Name;
- child = (Structs.ItemChild)this.mHTItemChild[flagKey];
- child.Sequence = i;
- this.mHTItemChild.Remove(flagKey);
- DBOperator.UpdateItemChild(child);
- this.mHTItemChild.Add(flagKey, child);
- }
- }// end else
- }
DB及DBAPI设计:
构建根子树的技巧:
- private void buildTreeView()
- {
- this.treeView1.Nodes.Clear();
- this.mHTRootItem.Clear();
- this.mHTItemChild.Clear();
- Structs.ItemRoot[] rootRecords = null;
- DBOperator.GetItemRoot(out rootRecords);
- if (rootRecords == null)
- return;
- for (int i =0;i {
- this.mHTRootItem.Add(rootRecords[i].FlagKey, rootRecords[i]);
- TreeNode newNode = treeView1.Nodes.Add(rootRecords[i].Title);
- newNode.Name = rootRecords[i].FlagKey.ToString();
- newNode.ImageIndex = 0;
- newNode.SelectedImageIndex = 1;
- AddChild(newNode);
- }
- this.treeView1.ExpandAll();
- }
- private void AddChild(TreeNode parentNode)
- {
- if (parentNode == null)
- return;
- string parentFlagKey = parentNode.Name;
- Structs.ItemChild[] childRecords = null;
- DBOperator.GetItemChild(out childRecords,parentFlagKey);
- if (childRecords == null)
- return;
- for (int i = 0; i childRecords.Length;i++)
- {
- this.mHTItemChild.Add(childRecords[i].FlagKey, childRecords[i]);
- TreeNode newNode = parentNode.Nodes.Add(childRecords[i].Title);
- newNode.Name = childRecords[i].FlagKey;
- newNode.ImageIndex = 2;
- newNode.SelectedImageIndex = 3;
- AddChild(newNode);
- }
- }
参考文献: