Web中的TreeView中的没有PreNode和NextNode属性。
但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点。
TreeView中要么只有一个根节点;要么没有根节点,都是并列排的,这个要判断。
这里主要是用了递归,把有子节点的节点一起移动。
1.首先要定义节点集合交换变量
1 TreeNode preNode, nextNode, currentNode; 2 List<TreeNode> currNodelist = new List<TreeNode>(); 3 List<TreeNode> Nodelist = new List<TreeNode>();
2.上移按钮的方法


//当前选中节点 currentNode = TreeView1.SelectedNode; if (currentNode == null) { return; } else { //判断是否有父节点,根据父节点取数据 if (currentNode.Parent != null) { //前一个节点索引 int pre = currentNode.Parent.ChildNodes.IndexOf(TreeView1.SelectedNode) - 1; if (pre == -1) { return; } else { //第一个节点 TreeNode fisrtnode = currentNode.Parent.ChildNodes[0]; //前一个节点 preNode = currentNode.Parent.ChildNodes[pre]; //判断第一个节点是否自己 if (currentNode == preNode) { return; } else { //交换数据,并选中 Exchange(currentNode, preNode); } } } else//没有父节点,直接从根节点读 { //前一个节点索引 int pre = this.TreeView1.Nodes.IndexOf(TreeView1.SelectedNode) - 1; if (pre == -1) { return; } else { //第一个节点 TreeNode fisrtnode = this.TreeView1.Nodes[0]; //前一个节点 preNode = this.TreeView1.Nodes[pre]; //判断第一个节点是否自己 if (currentNode == preNode) { return; } else { //交换数据,并选中 Exchange(currentNode, preNode); } } } }
3.下移按钮中的方法


currentNode = TreeView1.SelectedNode; if (currentNode == null) { return; } else { if (currentNode.Parent != null) { //下一个节点索引 int next = currentNode.Parent.ChildNodes.IndexOf(TreeView1.SelectedNode) + 1; //最后一个节点 TreeNode lastnode = currentNode.Parent.ChildNodes[currentNode.Parent.ChildNodes.Count - 1]; if (lastnode == currentNode) { return; } else { //下一个节点 nextNode = currentNode.Parent.ChildNodes[next]; //交换数据 Exchange(currentNode, nextNode); } } else { //下一个节点索引 int next = this.TreeView1.Nodes.IndexOf(TreeView1.SelectedNode) + 1; //最后一个节点 TreeNode lastnode = this.TreeView1.Nodes[this.TreeView1.Nodes.Count - 1]; //判断最一个节点是否自己 if (lastnode == currentNode) { return; } else { //下一个节点 nextNode = this.TreeView1.Nodes[next]; Exchange(currentNode, nextNode); } } }
4.节点中子节点递归加载到集合中,因为要两两交换,所以定义了两个递归方法


/// <summary> /// 获取上一个节点的所有子节点,加载到当前节点集合中 /// </summary> /// <param name="node"></param> private void FetchNode(TreeNode node) { for (int i = 0; i < node.ChildNodes.Count; i++) { currNodelist.Add(node.ChildNodes[i]); } for (int j = 0; j < node.ChildNodes.Count; j++) { FetchNode(node.ChildNodes[j]); } } /// <summary> /// 获取下一个节点的所有子节点 /// </summary> /// <param name="node"></param> private void FetchNextNode(TreeNode node) { for (int i = 0; i < node.ChildNodes.Count; i++) { Nodelist.Add(node.ChildNodes[i]); } for (int j = 0; j < node.ChildNodes.Count; j++) { FetchNextNode(node.ChildNodes[j]); } }
5.如果该节点有子节点就要交换子节点,递归加入,我是用ToolTip保存了父节点的ID


private void AddNode(TreeNode node, List<TreeNode> list) { List<TreeNode> tnlist = list.Where(n => n.ToolTip == node.Value).ToList(); foreach (TreeNode item in tnlist) { node.ChildNodes.Add(item); AddNode(item, list); } }
6.这是个数据交换的方法


1 /// <summary> 2 /// 两节点之间的数据交换 3 /// </summary> 4 /// <param name="current">当前节点</param> 5 /// <param name="node">上一个节点或下一个节点</param> 6 private void Exchange(TreeNode current, TreeNode node) 7 { 8 //判断是否有子节点 9 if (current.ChildNodes.Count > 0) 10 { 11 //获取当前所有节点填充到currNodelist 12 FetchNode(current); 13 } 14 if (node.ChildNodes.Count > 0) 15 { 16 //填充节点到Nodelist(上一节点或下一节点的子节点集合) 17 FetchNextNode(node); 18 } 19 //交换数据 20 string g_text = node.Text;//文本 21 string g_tag = node.Target;//排序字段 22 string g_id = node.Value;//唯一ID 23 string toop = node.ToolTip;//父ID 24 bool isadd = node.PopulateOnDemand;//是否动态填充节点 25 26 node.Target = current.Target; 27 node.Text = current.Text; 28 node.Value = current.Value; 29 node.ToolTip = toop; 30 node.PopulateOnDemand = current.PopulateOnDemand; 31 32 current.Target = g_tag; 33 current.Text = g_text; 34 current.Value = g_id; 35 current.ToolTip = toop; 36 current.PopulateOnDemand = isadd; 37 //选中 38 node.Selected = true; 39 //先清空后递归添加节点 40 current.ChildNodes.Clear(); 41 AddNode(current, Nodelist); 42 node.ChildNodes.Clear(); 43 AddNode(node, currNodelist); 44 }
第一次写博客,嘿嘿!