C# Treeview checking if node exists

前端 未结 8 565
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-23 12:42

I\'m trying to populate a treeview from an XmlDocument. The Root of the tree is set as \'Scripts\' and from the root the next level should be \'Departments\' which is within the

相关标签:
8条回答
  • 2021-01-23 13:05
    if(treeView1.Nodes.ContainsKey("DEPARTMENT")){
    //...
    }
    

    EDIT: Recursive method:

     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;
        }
    
    0 讨论(0)
  • 2021-01-23 13:08

    You can do something like this:

    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
        }
    }
    
    0 讨论(0)
  • I use,

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

    That line guarantees that a lookup of the value department will be done first, if not found it creates it. You have to do the double entry in Add() so it will have a key value you can do the lookup with the .Nodes[department].

    0 讨论(0)
  • 2021-01-23 13:14

    Not sure about the document structure...
    Couldn't you use Linq to Xml, load the document and get the distinct row ( row = department?) and consider only those elements to create a TreeNode? It is more efficient than trying to find if a node with such a text has already been added. ex:

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

    Here the EqualityComparer is made on the "name" attribute value assuming the doc structure to be

    <rows><row name='dep1'><script>script1</script><script>script2</script></row><row name='dep1'><script>script3</script><script>script4</script></row></rows>
    
    0 讨论(0)
  • 2021-01-23 13:18

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

    http://forums.asp.net/t/1645725.aspx/1?Check+if+child+Node+exists+on+treeview

    0 讨论(0)
  • 2021-01-23 13:19

    If your XML document has a set structure where 'Departments' will always be indexed at 1;

    ie:

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

    Then you could encapsulate the following code into a method where 'name' is a string parameter and the return type is boolean.

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

    The idea is you would call that function each time you encounter a 'Department' node in your Xml, before creating the TreeNode.

    Full example:

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

    Lastly, the easy way:

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

    These are all just refactored and encapsulated into their own named methods, you of course could just call:

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

    ...during your parsing of your XML. PS. These examples all assume that you have the first root node in the TreeView already created and added to the TreeView.

    0 讨论(0)
提交回复
热议问题