分享
 
 
 

关于如何移除TreeView中的所有选中节点的一点体会

王朝other·作者佚名  2007-07-18
窄屏简体版  字體: |||超大  

关于如何移除TreeView中的所有选中节点的一点体会

关于这个算法大概有两个常用的方法,一个就是递归,一个非递归的(呵呵,好像是废话哈),递归写起来可能代码比较简洁,但是效率不高,非递归方法写起来不是很容易,但是效率较递归来说很有优势,下面我就说一下我在这方面的两个方法(这是现在我做项目体会到的)。

先看看我用的递归方法,整体思路是:首先对根节点下的所有子节点做一个循环,在循环体里边,①判断该子节点是否是叶节点,是的话就移除该节点,并且将子节点数count减一,计数器i也减一,否则就递归调用方法traverse ( childNode )并重新获取该节点的子节点数(childCount = childNode.ChildNodes.Count;)②判断该节点的子节点数是否为0,是的话就移除该节点

// 获得TreeView的根节点

TreeNode node = TreeView.Nodes [0];

// 递归方法

traverse ( node );

/// <summary>

/// 递归移除所有选中的节点

/// </summary>

/// <param name="parentNode"></param>

private void traverse ( TreeNode parentNode )

{

int count = parentNode.ChildNodes.Count;

for ( int i = 0 ; i < count ; i++ )

{

TreeNode childNode = parentNode.ChildNodes [i];

// 移除之前的子节点数

int childCount = childNode.ChildNodes.Count;

// 移除算法

if ( childCount > 0 )

{

// 递归调用

traverse ( childNode );

// 移除之后剩余的子节点

childCount = childNode.ChildNodes.Count;

}

else if ( childNode.ChildNodes.Count == 0 && childNode.Checked )

{

// 您要做的其他操作

// 移除被选中的节点

parentNode.ChildNodes.Remove ( childNode );

--count;

--i;

}

// 移除被选中的父节点(如果父节点的子节点数为0,父节点也要移除)

if ( childCount == 0 )

{

parentNode.ChildNodes.Remove ( childNode );

--count;

--i;

}

}

}

下面是非递归算法,整体思路是循环访问TreeView里边的选中的节点的集合的第一个节点(checkBoxes [0]),①如果checkBoxes [0]不是叶节点,就将其选中状态设为false,而不移除②如果checkBoxes [0]是叶节点,判断其父节点的子节点数是否为1,是的话就将checkBoxes [0]的父节点设置为要移除的节点(父节点被移除,子节点也会跟着被移除,于是达到了移除只有一个子节点的父节点的子节点时联动移除该子节点的父节点的目的),再去判断它的父节点的父节点的子节点数是否为1(while ( node.Parent.ChildNodes.Count == 1 ))……如此循环,最后移除当前的节点,那么该节点下的所有子节点都会被移除

// 非递归方法

RemoveCheckedNodes ( TreeView);

/// <summary>

/// 清除选中的节点并更新数据库

/// </summary>

/// <param name="tree"></param>

private void RemoveCheckedNodes ( TreeView tree )

{

// 获取所有选中的节点集合

TreeNodeCollection checkBoxes = tree.CheckedNodes;

while ( checkBoxes.Count > 0 )

{

// 判断checkBoxes [0]节点是否是叶节点

if (checkBoxes [0]不是叶节点 )

{

checkBoxes [0].Checked = false;

}

else if (checkBoxes [0]是叶节点 )

{

// 您要做的其他操作

// 声明当前选中节点为要移除的节点

TreeNode node = checkBoxes [0];

// 循环判断节点的父节点的所有子节点数是否为1

// 是的话就设父节点为要移除的节点

while ( node.Parent.ChildNodes.Count == 1 )

{

node = node.Parent;

}

// 移除节点

TreeNode parentNode = node.Parent;

parentNode.ChildNodes.Remove ( node );

}

}

}

如有不当之处,还请大家指出

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有