ASP.Net中的TreeView控件中对节点的上移和下移操作
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控件中对节点的上移和下移操作的更多相关文章
- WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色
本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...
- 将数据库数据显示到TreeView控件中
实现效果: 知识运用: TreeView控件中的Nodes集合的Add方法 实现代码: private void init() { treeView1.ShowLines = true; treeVi ...
- 【ASP.NET 进阶】TreeView控件学习
这几天上班没事做,也不好打酱油,学点没接触过的新东西吧,基本了解了下TreeView控件. TreeView 控件用于在树结构中显示分层数据,例如目录或文件目录等. 下面看代码吧: 1.效果图 2.静 ...
- C#中向ListView控件中添加一行数据
C#中向ListView控件中添加一行数据: ,先声明一个ListViewItem: ListViewItem item = new ListViewItem(); ,添加第一列数据: item.Te ...
- 给C#的treeview控件的部分节点添加checkbox
一.先初始化treeview this.treeView1.CheckBoxes = true; this.treeView1.ShowLines = false; this.treeView1.Dr ...
- 在工作表左侧中添加TreeView控件
开发环境基于VSTO:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 需求是在sheet的左侧停靠System.Windows.Forms.TreeV ...
- android中去掉ListView控件中的分割线
通过设置android:divider="@null" ,可以去掉ListView控件中的分割线 也可以自定义分割线的颜色,比如: <ListView android:id= ...
- Treeview控件的Node节点延迟加载
Treeview控件是一个很常用的控件,用于展示资源或者组织结构的时候很方便,通常会在系统启动时进行资源的加载和节点目录的初始化,但在资源较多和层级较深的情况下,所有节点加载出来会耗费太多时间,影响体 ...
- 关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
WPF中所有的集合类控件,子项都不能继承父级的DataContext,需要手动将绑定的数据源指向到父级控件才可以. <DataGridTemplateColumn Header="操作 ...
随机推荐
- MySQL索引(一)索引基础
索引是数据库系统里面最重要的概念之一.一句话简单来说,索引的出现其实是为了提高数据查询的效率,就像书的目录一样. 常见模型 索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,这里就介绍三种常 ...
- buucitf-[极客大挑战 2020]Roamphp1-Welcome
打开靶机,发现什么也没有,因为极客大挑战有hint.txt,里面说尝试换一种请求的方式,bp抓包,然后发送了POST请求,出现了下面的界面 这个还是挺简单的,因为是极客大挑战上的第一波题,关键是这个如 ...
- System.out.println();快捷键
不同开发工具的输出快捷键是不一样的-System.out.println(); eclipse&my eclipse中是syso +(alt+/) idea 是sout +tab 或者sout ...
- TMOOC 1969 开锁
update on 2020.2.28 时隔近日重新想这道题,其实复杂度正确的解法是 可持久化 01 Trie. 考虑对于每一个 \(a[i]\),考虑能将它作为最大值的最大包容区间 \([l, r] ...
- echarts饼图默认状态高亮显示
需求:饼状图默认状态下高亮显示指定内容. 最常见的两种: 一.饼图中间始终默认展示数据总数和统计事项的名字(如下图),这种实现方式比较简单,就不多介绍 二.饼图中间默认展示某一图例的具体数据,鼠标放在 ...
- 如何更简单的使用Polly
Polly 弹性瞬时错误处理库 Polly是一个C#实现的弹性瞬时错误处理库 它可以帮助我们做一些容错模式处理,比如: 超时与重试(Timeout and Retry) 熔断器(Circuit Bre ...
- C#跳过工作日,计算几个工作日之后到期的方法
需求:消费者投诉企业,企业在2个工作日之内做出应答. 分析:1.工作日要刨去周末和法定节假日,而且每年的节假日不一样. 2.消费者可以在任意时间发起投诉,如果在非工作日发起了投诉,那么计算时间应该从工 ...
- 07-flask-使用sqlalchemy
代码 from flask import Flask, render_template from sqlalchemy import create_engine from sqlalchemy.ext ...
- kali docker简单使用-vulhub搭建fastjson漏洞环境
准备环境 安装kali和docker参考: https://www.cnblogs.com/lijingrong/p/13396884.html sudo service docker start / ...
- Protobuf简单类型直接反序列化方法
我有一个想法,有一个能够进行跨平台的高性能数据协议规范,能够让数据在两个不同的程序之间进行读取,最好能够支持直接将object序列化,那就完美了. 目标 支持任意Object序列化 支持从类似Syst ...