C#树视图检查节点是否存在

本文关键字:是否 存在 节点 检查 视图 | 更新日期: 2023-09-27 17:57:38

我正在尝试从XmlDocument填充树视图。树的根被设置为"Scripts",从根开始,下一个级别应该是XML脚本中的"Departments"。我可以毫无问题地从XML文档中获取数据。我的问题是,当循环遍历XmlDocument并将节点添加到根节点时,我希望确保如果某个部门已经在树视图中,则不会再次添加该部门。我还应该补充一点,每个部门都有一个脚本列表,这些脚本需要成为该部门的子节点。

到目前为止,我的代码是:

        XmlDocument xDoc = new XmlDocument();
        xDoc.LoadXml(scriptInformation);
        TreeNode t1;
        TreeNode rootNode = new TreeNode("Script View");
        treeView1.Nodes.Add(rootNode);
        foreach (XmlNode node in xDoc.SelectNodes("//row"))
        {
            t1 = new TreeNode(node["DEPARTMENT"].InnerXml);
           //How to check if node already exists in treeview?

        }

谢谢。

C#树视图检查节点是否存在

if(treeView1.Nodes.ContainsKey("DEPARTMENT")){
//...
}

EDIT:递归方法:

 bool exists = false;
        foreach (TreeNode node in treeView1.Nodes) {
            if (NodeExists(node, "DEPARTMENT"))
                exists = true;
        }
    private bool NodeExists(TreeNode node, string key) {
        foreach (TreeNode subNode in node.Nodes) {
            if (subNode.Text == key) {
                return true;
            }
            if (node.Nodes.Count > 0) {
                NodeExists(node, key);
            }
        }
        return false;
    }

根据XML文件的大小,可以考虑使用关联的List进行快速查找。将每个节点添加到TreeView时,也将其添加到List

如果您的XML文档具有一个集合结构,其中"Departments"将始终索引为1;

即:

index:[0] Scripts
    index:[1] Department
        index:[2] Script
    index:[1] Department2
        index:[2] Script

然后,您可以将以下代码封装到一个方法中,其中"name"是一个字符串参数,返回类型是布尔值。

foreach (TreeNode node in uxTreeView.Nodes[0].Nodes) {
    if (node.Name.ToLower() == name.ToLower()) {
        return true;
    }
}
return false;

其想法是,在创建TreeNode之前,每次在Xml中遇到"Department"节点时,都会调用该函数。

完整示例:

private bool DepartmentNodeExists(string name) {
    foreach (TreeNode node in uxTreeView.Nodes[0].Nodes) {
        if (node.Name.ToLower() == name.ToLower()) {
            return true;
        }
    }
    return false;
}

最后,简单方式:

private bool DepartmentNodeExists(string name) {
    if (uxTreeView.Nodes[0].ContainsKey(name)) {
        return true;
    }
    else {
        return false;
    }
}

这些都只是重构并封装到它们自己的命名方法中,当然你可以调用:

if (uxTreeView.Nodes[0].ContainsKey(name)) {
    // do not create TreeNode
}

在解析XML的过程中。PS。这些示例都假设TreeView中的第一个根节点已经创建并添加到TreeView中。

http://www.vbdotnetforums.com/listviews-treeviews/13278-treeview-search.html#post39625

http://forums.asp.net/t/1645725.aspx/1?Check+如果+child+Node+存在+on+treeview

您可以这样做:

TreeNode parentNode = t1.Parent;
if (parentNode != null}
{
    if(parentNode.Nodes.Cast<TreeNode>().ToList().Find(t => t.Text.Equals(node["DEPARTMENT"].InnerXml) == null)
    {
        //Add node
    }
}
else
{
    bool isFound = true;
    if (treeView1.Nodes.Cast<TreeNode>().ToList().Find(t => t.Text.Equals(node["DEPARTMENT"].InnerXml) == null)
    {
        isFound = false;
    }
    if(!isFound)
    {
        //Add node
    }
}

不确定文档结构
难道你不能使用Linq来Xml,加载文档并获得不同的行(row=department?),然后只考虑那些元素来创建TreeNode吗?它比试图查找是否已经添加了具有此类文本的节点更有效。例如:

 var rows =      (  from row  in XDocument.Load(document).Root.Elements("row")
                    select row
                 ).Distinct(new SampleElementComparerOnNameAttribute());

在这里,EqualityComparer是在假设文档结构为的"name"属性值上进行的

<rows><row name='dep1'><script>script1</script><script>script2</script></row><row name='dep1'><script>script3</script><script>script4</script></row></rows>

我使用

string department = node["DEPARTMENT"].InnerXml;
TreeNode node = parentNode.Nodes[department] ?? parentNode.Nodes.Add(department, department);

这一行保证首先查找值部门,如果找不到它,它会创建它。您必须在Add()中进行双输入,这样它就会有一个键值。您可以使用.Nodes[department]. 进行查找

这取决于输入的结构。由于您没有显示如何添加子节点,因此我只能将您指向Nodes属性的ContainsContainsKey方法、treeView1本身或您添加的任何子节点。您应该使用Add方法的重载来指定密钥名称,以简化查找。