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. Get请求Test

    一.新建测试套 作为管理接口,可按功能分类,也可按业务逻辑分类,根目录下最多一级子目录.运行接口时,可按测试套为单位,整体运行. 二.选择请求类型,输入接口地址 根据接口文档中提供的接口请求类型及地址 ...

  2. Python实现自动整理文件

    前言 工作上的文档和资料好几个月没整理了,因为平常太忙都是随手往桌面丢.整个桌面杂乱无章全是文档和资料.几乎快占满整个屏幕了,所有我必须要整理一下了.但是手动整理太费时间了,于是我想到了python. ...

  3. CommandLineRunner 可能会导致你的应用宕机停止,我劝你耗子尾汁

    hello,大家好,我是小黑,又和大家见面啦~~ 如果你去某度搜索关键词 CommandLineRunner 初始化资源 ,截止小黑同学写这篇推文之前,大概能收到 1,030,000 个结果. 网上大 ...

  4. 基于Fisco-Bcos的区块链智能合约-简单案例实践

    一.智能合约介绍 智能合约是指把合同/协议条款以代码的形式电子化地放到区块链网络上.FISCO BCOS平台支持两种智能合约类型:Solidity智能合约与预编译智能合约 Solidity与Java类 ...

  5. 使用plesk遇到的问题

    按照plesk使用指南中,"快速建站"的部分,配置一番后,还是访问不了网站. 后来解决了,原因如下: 主域名没有解析,只解析了,带www的子域名 80端口没开

  6. STL—— 容器(vector)的数据插入之 insert()

    vector 容器可以使用 vectorName.insert() 方法插入元素,vectorName.insert() 函数一共有4种重载方法: 第一种 insert() 用法:在指定地址插入单个元 ...

  7. 安卓 Android Studio 下载

    http://www.android-studio.org/    下载地址 https://blog.csdn.net/qq_41976613/article/details/91432304    ...

  8. 栈的应用:表达式括号匹配检测(C)

    问题说明: 假设数学表达式中允许包含两种括号:圆括号"()"和方括号"[]",嵌套顺序任意. 正确的嵌套模式:( [ ] ( ) ).[ ( [ ] [ ] ) ...

  9. SQL注入fuzz字典

    length Length + handler likeLiKe selectSeleCT sleepSLEEp databaseDATABASe delete having oroR asAs -~ ...

  10. centos7安装Hive及其问题解决

    本地如何安装hive (安装hive之前需要安装hadoop并启动hadoop的相关集群,mysql数据库) hadoop集群是两台,一台作为master,两台作为slaver,mysql单独占用一台 ...