重新构造TreeView结构的问题

cleverboy25 2005-06-28 11:29:49
选父节点做删除操作,只删除节点不为(*)号,树要保留原来结构
删除前:
|――1(*) 父节点
|――2-1(*)
|――3
|――4(*)
|――5
|――2-2

删除后:
|――1(*) 父节点
|――2-1(*)
|――4(*)

现在问题是,用了递归方法,找出了所有带(*)节点,
但如何重新构造树让它保持原来结构?
...全文
112 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eddie005 2005-07-05
  • 打赏
  • 举报
回复
气死偶了~~~

花了不少功夫回答,居然是给小日本写的程序!!!
cleverboy25 2005-07-05
  • 打赏
  • 举报
回复
问题基本解决了代码如下,大家看看
/// <summary>
/// 取得集計部門
/// </summary>
/// <param name="parenet">主ノード</param>
/// <param name="NewTree">当前ノード</param>
private void GetSyuukeiBumon(TreeNode parenet,TreeNode NewTree)
{
foreach(TreeNode tnNode in parenet.Nodes)
{
//集計部門の場合
if( tnNode.SelectedImageIndex == 4 )
{

bool bPutRoot = false;
int iPostition = tnNode.FullPath. Split('\\').Length - 1;
TreeNode tnCheckNode = tnNode;
for( int i = iPostition ; i > 1 ; i-- )
{
tnCheckNode = tnCheckNode.Parent;
//父ノードは部門である場合
if( tnCheckNode.SelectedImageIndex != 4 )
{
bPutRoot = true;
break;
}


}

TreeNode tnAdd = new TreeNode( tnNode.Text,4,4 );

//追加ノード
if( !bPutRoot )
{
NewTree.Nodes.Add(tnAdd);
}
//外ノード
else
{
_outOfTreeNode.Add(tnAdd);
}
GetSyuukeiBumon(tnNode,tnAdd);
}
else
{
GetSyuukeiBumon(tnNode,NewTree);
}

}
}
cleverboy25 2005-06-28
  • 打赏
  • 举报
回复
直接不行,要是你把3节点删掉了,那下面的4,5节点都没了,结果就不对了
我得想法是把所有带(*)的节点找到后COPY一份,然后直接删除父节点,
但树结构还原还没想到办法.....
cdo 2005-06-28
  • 打赏
  • 举报
回复
从父节点开始,遍历所有节点,当发现带*节点,立即删除.

或者你把所有节点都带上1,1-1,1-2,1-1-1这样的标记用于重新构建树.
JasonHeung 2005-06-28
  • 打赏
  • 举报
回复
直接删除节点。递归寻找叶子,满足要求保留;不满足删除,再考虑父节点,满足要求保留,不满足,将其子节点添加到其父节点的子节点中。直到根节点为止。
cleverboy25 2005-06-28
  • 打赏
  • 举报
回复
mNodes 变量是?
  • 打赏
  • 举报
回复
删除项目后子项需要按什么方式提前呢
Eddie005 2005-06-28
  • 打赏
  • 举报
回复
补充说明: 不能简单分割成删除和还原两个步骤来思考,应该在一次遍历中实现,
需要做的事情实际上除了“删除”还有如果节点不带*那么它的字节上移一层,核心问题是移到哪里?
因此需要一个像“游标”那样的东西,来指示节点是否需要移动,移动到哪里
leo_asp 2005-06-28
  • 打赏
  • 举报
回复
学习
Eddie005 2005-06-28
  • 打赏
  • 举报
回复
void test(TreeNodeCollection currentNodes,TreeNodeCollection targetNodes)
{
//遍历子节点
foreach(TreeNode tmp in currentNodes)
{
bool isStar = false;//判断当前节点是否带*,但是先不要删除
if(isStar && (currentNodes!=mNodes))
{
//将tmp加(复制)到target里
}
TreeNodeCollection mNodes = targetNodes;
if(isStar) mNodes = tmp.Nodes;
//递归调用
test(tmp.Nodes,mNodes);

if(!isStar){//删除tmp}
}
}
========
开始执行 test(treeView1.Nodes,TreeView1.Nodes);

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧