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 }

第一次写博客,嘿嘿!

ASP.Net中的TreeView控件中对节点的上移和下移操作的更多相关文章

  1. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...

  2. 将数据库数据显示到TreeView控件中

    实现效果: 知识运用: TreeView控件中的Nodes集合的Add方法 实现代码: private void init() { treeView1.ShowLines = true; treeVi ...

  3. 【ASP.NET 进阶】TreeView控件学习

    这几天上班没事做,也不好打酱油,学点没接触过的新东西吧,基本了解了下TreeView控件. TreeView 控件用于在树结构中显示分层数据,例如目录或文件目录等. 下面看代码吧: 1.效果图 2.静 ...

  4. C#中向ListView控件中添加一行数据

    C#中向ListView控件中添加一行数据: ,先声明一个ListViewItem: ListViewItem item = new ListViewItem(); ,添加第一列数据: item.Te ...

  5. 给C#的treeview控件的部分节点添加checkbox

    一.先初始化treeview this.treeView1.CheckBoxes = true; this.treeView1.ShowLines = false; this.treeView1.Dr ...

  6. 在工作表左侧中添加TreeView控件

    开发环境基于VSTO:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 需求是在sheet的左侧停靠System.Windows.Forms.TreeV ...

  7. android中去掉ListView控件中的分割线

    通过设置android:divider="@null" ,可以去掉ListView控件中的分割线 也可以自定义分割线的颜色,比如: <ListView android:id= ...

  8. Treeview控件的Node节点延迟加载

    Treeview控件是一个很常用的控件,用于展示资源或者组织结构的时候很方便,通常会在系统启动时进行资源的加载和节点目录的初始化,但在资源较多和层级较深的情况下,所有节点加载出来会耗费太多时间,影响体 ...

  9. 关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法

    WPF中所有的集合类控件,子项都不能继承父级的DataContext,需要手动将绑定的数据源指向到父级控件才可以. <DataGridTemplateColumn Header="操作 ...

随机推荐

  1. Paddle源码之内存管理技术

    前言 在深度学习模型训练中,每次迭代过程中都涉及到Tensor的创建和销毁,伴随着的是内存的频繁 malloc和free操作,可能对模型训练带来不必要的 overhead. 在主流的深度学习框架中,会 ...

  2. 沪苏浙皖共同打造区块链数字经济发展高地,Panda Global表示区块链真的来了!

    近日,在长三角一体化发展重大合作事项签约仪式上,沪苏浙皖经信部门共同签约,推进长三角区块链数字经济一体化发展,共同打造数字经济发展高地.从此次签约活动也能看出来,区块链数字现金的发展已经得到了认可,早 ...

  3. Codeforces Edu Round 55 A-E

    A. Vasya and Book 简单的取余运用. #include <iostream> #include <cstdio> #include <limits.h&g ...

  4. python学习之路 初识xml

    import requests from xml.etree import ElementTree as ET r = requests.get('http://www.webxml.com.cn// ...

  5. SpringBoot使用Mybatis-plus及分页功能的细节部分

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  6. uwsgi+nginx 基于linux的各种离谱错误

    1.常见的排查方法 1.nginx错误 启动报错 systemctl restart nginx tail -f /var/log/nginx/error.log 在浏览器中访问抱错 tail -f ...

  7. STL——容器(Set & multiset)的删除 erase

    set.clear();             //清除所有元素 set.erase(pos);     //删除pos迭代器所指的元素,返回下一个元素的迭代器. set.erase(beg,end ...

  8. Java经典小游戏——贪吃蛇简单实现(附源码)

    一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...

  9. Excel优雅导出

    流程 原来写过一篇文章,是介绍EasyExcel的,但是现在有些业务需要解决,流程如下 1.需要把导出条件转换成中文并存入数据库 2.需要分页导出 3.需要上传FTP或者以后上传OSS 解决方案 大体 ...

  10. Unity 自动烘培Cpu占用过高电脑卡死

    起因 打开Unity项目   发现右下方一直