在C#中可以使用foreach来遍历一个集合,如果要遍历一个其元素包含子元素的集合(比如遍历一个TreeView控件的所有节点),可以使用循环可迭代来实现。
我们可以使用泛型方法来构造一个通用的集合遍历器来简化这个常见的编程任务:
![]()
通用集合遍历方法 /// <summary>
/// 对一个集合中的元素执行指定的操作
/// </summary>
/// <typeparam name="ColT">集合类型</typeparam>
/// <typeparam name="EleT">元素类型</typeparam>
/// <param name="collection">集中对象</param>
/// <param name="GetChildrenMethod">表示获取集合中子元素的方法的委托实例</param>
/// <param name="EleAction">表示对集合中每个元素进行操作的方法的委托实例,将把元素作为参数传递给这个委托实例</param>
public static void Each<ColT,EleT>(ColT collection,Func<EleT,ColT> GetChildrenMethod,Action<EleT> EleAction) where ColT:IEnumerable{
if (EleAction == null) {
throw new ArgumentNullException("EleAction", "对集合中元素进行操作的方法不能为空");
}
foreach(EleT x in collection ){
EleAction(x);
if (GetChildrenMethod != null)
{
ColT children = GetChildrenMethod(x);
Each<ColT, EleT>(children, GetChildrenMethod, EleAction);
}
}
}
应用实例1:
在一个treeView中,改变一个节点的复选框状态时自动改变它的所有子节点的复选框状态。
在treeView的AfterCheck事件处理方法中加入下面的代码
![]()
TreeViewAfterCheck if (e.Action == TreeViewAction.Unknown) {
return;
}
TreeNode currentNode = e.Node;
//控制下级所有节点选中状态
if (currentNode != null)
{
Common.Each<TreeNodeCollection, TreeNode>(
currentNode.Nodes
, (TreeNode inNode) => { return inNode.Nodes; }
, (TreeNode eleNode) => {
eleNode.Checked = currentNode.Checked;
}
);
}
注意:根据实际情况,需要将以上代码中的Common.Each换成您自己的调用方法。
应用实例2:遍历TreeView,获取所有选中节点并存储在一个列表中
假定form中有一个TreeView成员treeView1,可以使用下面代码获取所有选中的节点对象
![]()
TreeViewGetCheckedNodeList<TreeNode> getedTreeNodes=new List<TreeNode>();
Common.Each<TreeNodeCollection, TreeNode>(
treeView1.Nodes
, (TreeNode inNode) => { return inNode.Nodes; }
,(TreeNode eleNode) => {
if(eleNode.Checked)getedTreeNodes.Add(eleNode);
}
)