您的位置:首页 > 编程语言 > ASP

ASP.Net中的TreeView控件中对节点的上移和下移操作

2013-12-26 14:38 856 查看
Web中的TreeView中的没有PreNode和NextNode属性。

但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点。

TreeView中要么只有一个根节点;要么没有根节点,都是并列排的,这个要判断。

这里主要是用了递归,把有子节点的节点一起移动。

还有一点是,对父节点ID的保存,这里是保存在TreeNode 的Targe属性中

1.首先要定义节点集合交换变量

TreeNode preNode, nextNode, currentNode;
List<TreeNode> currNodelist = new List<TreeNode>();
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.如果该节点有子节点就要交换子节点,递归加入,我是用Target保存了父节点的ID

private void AddNode(TreeNode node, List<TreeNode> list)
{
List<TreeNode> tnlist = list.Where(n => n.Target== node.Value).ToList();
foreach (TreeNode item in tnlist)
{
node.ChildNodes.Add(item);
AddNode(item, list);
}
}


6.这是个数据交换的方法

/// <summary>
/// 两节点之间的数据交换
/// </summary>
/// <param name="current">当前节点</param>
/// <param name="node">上一个节点或下一个节点</param>
private void Exchange(TreeNode current, TreeNode node)
{
//判断是否有子节点
if (current.ChildNodes.Count > 0)
{
//获取当前所有节点填充到currNodelist
FetchNode(current);
}
if (node.ChildNodes.Count > 0)
{
//填充节点到Nodelist(上一节点或下一节点的子节点集合)
FetchNextNode(node);
}
//交换数据
string g_text = node.Text;//文本
string g_tag = node.Target;//排序字段
string g_id = node.Value;//唯一ID
string toop = node.ToolTip;//父ID
bool isadd = node.PopulateOnDemand;//是否动态填充节点

node.Target = current.Target;
node.Text = current.Text;
node.Value = current.Value;
node.ToolTip = toop;
node.PopulateOnDemand = current.PopulateOnDemand;

current.Target = g_tag;
current.Text = g_text;
current.Value = g_id;
current.ToolTip = toop;
current.PopulateOnDemand = isadd;
//选中
node.Selected = true;
//先清空后递归添加节点
current.ChildNodes.Clear();
AddNode(current, Nodelist);
node.ChildNodes.Clear();
AddNode(node, currNodelist);
}


 

 第一次写博客,嘿嘿!


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐