Web中的TreeView中的没有PreNode和NextNode属性。
但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点。
TreeView中要么只有一个根节点;要么没有根节点,都是并列排的,这个要判断。
这里主要是用了递归,把有子节点的节点一起移动。
1.首先要定义节点集合交换变量
1 TreeNode preNode, nextNode, currentNode;2 ListcurrNodelist = new List ();3 List Nodelist = new List ();
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.节点中子节点递归加载到集合中,因为要两两交换,所以定义了两个递归方法
////// 获取上一个节点的所有子节点,加载到当前节点集合中 /// /// 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]); } } ////// 获取下一个节点的所有子节点 /// /// 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, Listlist) { List tnlist = list.Where(n => n.ToolTip == node.Value).ToList(); foreach (TreeNode item in tnlist) { node.ChildNodes.Add(item); AddNode(item, list); } }
6.这是个数据交换的方法
1 ///2 /// 两节点之间的数据交换 3 /// 4 /// 当前节点 5 /// 上一个节点或下一个节点 6 private void Exchange(TreeNode current, TreeNode node) 7 { 8 //判断是否有子节点 9 if (current.ChildNodes.Count > 0)10 {11 //获取当前所有节点填充到currNodelist12 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;//唯一ID23 string toop = node.ToolTip;//父ID24 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 }
第一次写博客,嘿嘿!