C# 列出树视图中所有选中的IEM,但不包括man节点

C# 列出树视图中所有选中的IEM,但不包括man节点,c#,winforms,treeview,C#,Winforms,Treeview,如何获取所有选中项,但排除带有子项的主节点 例如,看看这张图片: 我想得到所有选中的项目,但排除黄色的marekd,但仍然有他们的子项目列出 到目前为止,我做到了: List<String> CheckedNames(System.Windows.Forms.TreeNodeCollection theNodes) { List<String> aResult = new List<String>(); if (th

如何获取所有选中项,但排除带有子项的主节点

例如,看看这张图片:

我想得到所有选中的项目,但排除黄色的marekd,但仍然有他们的子项目列出

到目前为止,我做到了:

List<String> CheckedNames(System.Windows.Forms.TreeNodeCollection theNodes)
    {
        List<String> aResult = new List<String>();

        if (theNodes != null)
        {
            foreach (System.Windows.Forms.TreeNode aNode in theNodes)
            {
                if (aNode.Checked)
                {
                    string[] itemName = Regex.Split(aNode.Text, " - ");
                    aResult.Add(itemName[0]);
                }

                aResult.AddRange(CheckedNames(aNode.Nodes));
            }
        }

        return aResult;
    }
列出选中的名称(System.Windows.Forms.TreeNodeCollection节点)
{
List aResult=新列表();
if(theNodes!=null)
{
foreach(节点中的System.Windows.Forms.TreeNode阳极)
{
如果(阳极检查)
{
字符串[]itemName=Regex.Split(阳极.Text,“-”);
aResult.Add(itemName[0]);
}
aResult.AddRange(选中的名称(阳极节点));
}
}
返回结果;
}
您可以使用扩展方法获取
TreeView
TreeNode
的子体。获取节点后,可以使用where子句筛选具有子节点的节点:

var result = treeView1.Descendants().Where(x=>x.Checked && x.Nodes.Count==0).ToList();
我创建了一些有用的扩展方法,用于在树视图中获取后代和祖先。要查看它们,请查看以下帖子:

  • :获取
    树视图
    树节点
  • :获取树节点的祖先

您可以了解更多信息。

一个简单的递归应该可以做到这一点(只是一个草图,未经测试):

void Main()
{
var startingNode=;
var aResult=新列表();
选中的名称(启动节点、结果);
}
void CheckedNames(树节点,列表结果)
{
做
{
if(node.FirstNode!=null)
{
CheckedNames(node.FirstNode,result);
}
其他的
{
如果(节点已选中)
{
//在这里使用正则表达式
添加(node.Text);
}
}
node=node.NextNode;
}while(node!=null);
}

希望有帮助。

是的,但要看情况而定。Ti si是我列表中的一个例子。因此,要求列出所有选中的项,但如果它们有子项,则排除“root”和“subroots”。为了更好地理解,我需要的是获取选中项的列表,当涉及到代码556311200时,它会跳过,但会打印子项18566310、103511210等等……请注意TreeNode.Level属性。@HansPassant似乎OP需要排除一些具有子节点的节点。例如,图像中高亮显示的节点
TreeNode.Level
将无助于区分这些根项目。有些人有孩子,有些人没有。谢谢!非常简单且有效的解决方案。这些扩展方法乍看起来似乎很复杂,但实际上非常有用且可重用。然后,您可以在一行代码中编写一些类似这样的复杂任务,可读、清晰:)