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 }
第一次写博客,嘿嘿!