树节点移动操作
----使用微软treeview控件
作者:pfengk
MSN: pfengk@hotmail.com
更多文章请访问:http://www.cnblogs.com/pfengk/
目录
概述................................................................................................................................. 1
操作演示.......................................................................................................................... 1
实现源码:[C#]................................................................................................................ 2
本文集中体现树节点移动实现代码其中很多其他代码省略。如果你对treeview控件不了解,请参阅我的另外一篇文章《web方式下权限分配简单实现》。
源码中引用命名空间Microsoft.Web.UI.WebControls。
本文描述节点移动算法效率非常低下,仅仅适合于节点不多的情况下使用。还请高手们多多指教。联系我的msn,谢谢你们!
窗体载入初始界面
选择节点之后
点击[赋予]按钮之后
再次点击[赋予]按钮之后

"一棵树到另一棵树的 节点移动方法"#region "一棵树到另一棵树的 节点移动方法"

/**//// <summary>
/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
/// </summary>
/// <param name="childTreeNode"></param>
/// <param name="parentTreeNode"></param>
/// <returns></returns>
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeView parentTreeView)

{
bool returnValue = false;

foreach(TreeNode tempTreeNode in parentTreeView.Nodes)

{
if (childTreeNode.Text == tempTreeNode.Text)

{
returnValue = true;
break;
}
}
return returnValue;
}


/**//// <summary>
/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
/// </summary>
/// <param name="childTreeNode"></param>
/// <param name="parentTreeNode"></param>
/// <returns></returns>
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeView parentTreeView,ref TreeNode foundTreeNode)

{
bool returnValue = false;

foreach(TreeNode tempTreeNode in parentTreeView.Nodes)

{
if (childTreeNode.Text == tempTreeNode.Text)

{
returnValue = true;
foundTreeNode = tempTreeNode;
break;
}
}
return returnValue;
}


/**//// <summary>
/// 从parentTreeNode(根节点)的所有节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
/// </summary>
/// <param name="childTreeNode"></param>
/// <param name="parentTreeNode"></param>
/// <returns></returns>
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeNode parentTreeNode)

{
bool returnValue = false;

foreach(TreeNode tempTreeNode in parentTreeNode.Nodes)

{
if (childTreeNode.Text == tempTreeNode.Text)

{
returnValue = true;
break;
}
}
return returnValue;
}


/**//// <summary>
/// 从parentTreeView(森林)的所有根节点中查找childTreeNode是否存在(使用Text属性为关键字比较),存在返回true.
/// </summary>
/// <param name="childTreeNode"></param>
/// <param name="parentTreeNode"></param>
/// <returns></returns>
public bool FindNodeFromChildNodes(TreeNode childTreeNode,TreeNode parentTreeNode,ref TreeNode foundTreeNode)

{
bool returnValue = false;

foreach(TreeNode tempTreeNode in parentTreeNode.Nodes)

{
if (childTreeNode.Text == tempTreeNode.Text)

{
returnValue = true;
foundTreeNode = tempTreeNode;
break;
}
}
return returnValue;
}


/**//// <summary>
/// 移除叶子节点。首先判断是否为叶子节点或根节点,是则移除,否则跳出返回
/// </summary>
/// <param name="treeNode"></param>
/// <returns></returns>
public bool RemoveLeafageChildNode(ref TreeNode treeNode)

{
bool returnValue = false;
if (treeNode.Nodes == null | treeNode.Nodes.Count == 0)

{//是子节点时候
if (treeNode.Parent is TreeNode)

{//父节点为节点类型时
int nodesCount = ((TreeNode)treeNode.Parent).Nodes.Count;
if (nodesCount > 1)

{//还有兄弟叶子节点时候,仅仅删除本节点
treeNode.Remove();
returnValue = true;
}
else

{//是唯一叶子节点时候,还要删除父节点
//删除本节点
TreeNode thisParentTreeNode = (TreeNode)treeNode.Parent;
treeNode.Remove();
//删除父节点
returnValue = RemoveLeafageChildNode(ref thisParentTreeNode);
}
}
else

{//父节点不为节点类型时,他一定是根节点
treeNode.Remove();
returnValue = true;
}
}
return returnValue;
}


/**//// <summary>
/// 【MoveNodes】将节点分支中所有被选中的节点,移动到另外一个节点分支上。前提根节点必须保留,且各节点Text值唯一。
/// </summary>
/// <param name="fromTreeView"></param>
/// <param name="toTreeNode"></param>
public void MoveNodes(ref TreeNode fromTreeNode,ref TreeNode toTreeNode)

{
bool selected = true;
//遍历fromTreeNode子节点,比较选中子节点在toTreeNode的子节点集中是否存在,不存在则移动子节点;存在跳过
int h = fromTreeNode.Nodes.Count-1;
for (int i = h ; i>=0;i--)

{
TreeNode rootNode = new TreeNode();
rootNode = fromTreeNode.Nodes[i];
//根节点是否被选中,否则跳过。
if (rootNode.Checked == selected)

{
//本节点是否为叶子节点
bool isDeleted = false;
//子节点在 toTreeNode中的子节点集 中是否存在
if (!FindNodeFromChildNodes (rootNode,toTreeNode))

{
//移动节点,判断是否为子节点。是子节点则从fromTreeNode中移除,同时判断是否为唯一节点,是同时移除父节点,
//反之忽略。
TreeNode rootNodeClone = ((TreeNode)rootNode.Clone());
int k = rootNodeClone.Nodes.Count;
for(int j=0; j<k;j++)

{
rootNodeClone.Nodes.RemoveAt(0);
}
toTreeNode.Nodes.Add(rootNodeClone);

isDeleted = RemoveLeafageChildNode(ref rootNode);
}

//移动子节点的整个分支
if (!isDeleted)

{
TreeNode toRootNode = new TreeNode();
//定位toTreeNode中与rootNode相同的节点位置。
FindNodeFromChildNodes(rootNode,toTreeNode,ref toRootNode);
//移动fromTreeNode中rootNode的分支中所有选中节点到toTreeNode的toRootNode分支中
MoveNodes(ref rootNode,ref toRootNode);
}
}
}
}

/**//// <summary>
/// 【MoveNodes】将一棵树中所有被选中的节点,移动到另外一棵树上。前提根节点必须保留,且各节点Text值唯一。
/// </summary>
/// <param name="fromTreeNode"></param>
/// <param name="toTreeNode"></param>
public void MoveNodes(ref TreeView fromTreeView,ref TreeView toTreeView)

{
bool selected = true;

//遍历fromTreeView根节点,比较选中节点在toTreeView的根节点集中是否存在,不存在则移动节点;存在跳过

int h = fromTreeView.Nodes.Count-1;
for (int i = h ; i>=0;i--)

{
TreeNode rootNode = new TreeNode();
rootNode = fromTreeView.Nodes[i];
//根节点是否被选中,否则跳过。
if (rootNode.Checked == selected)

{
//本节点是否为叶子节点
bool isDeleted = false;
//根节点在 toTreeView中的根节点中是否存在
if (!FindNodeFromChildNodes (rootNode,toTreeView))

{
//移动节点,判断是否为子节点。是子节点则从fromTreeView中移除,同时判断是否为唯一节点,是同时移除父节点,
//反之忽略。
TreeNode rootNodeClone = ((TreeNode)rootNode.Clone());
int k = rootNodeClone.Nodes.Count;
for(int j=0; j<k;j++)

{
rootNodeClone.Nodes.RemoveAt(0);
}

toTreeView.Nodes.Add(rootNodeClone);

isDeleted = RemoveLeafageChildNode(ref rootNode);
}
//移动根节点的整个分支
if (!isDeleted)

{
TreeNode toRootNode = new TreeNode();
//定位toTreeView中与rootNode相同的节点位置。
FindNodeFromChildNodes(rootNode,toTreeView,ref toRootNode);
//移动fromTreeView中rootNode的分支中所有选中节点到toTreeView的toRootNode分支中
MoveNodes(ref rootNode,ref toRootNode);
}
}
}
}

#endregion
[THE END]搜索一下相关内容
搜索一下相关内容 |
发表于 @ 2005年07月29日 18:24:00 | 评论( loading... ) | 举报| 收藏