C# Treeview проверка дали съществува възел

Опитвам се да попълня дървовиден изглед от XmlDocument. Коренът на дървото е зададен като „Скриптове“ и следващото ниво от корена трябва да бъде „Отдели“, което е в рамките на XML скрипта. Мога да получа данни от 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?



        }

Благодаря.


person Darren Young    schedule 23.05.2011    source източник


Отговори (8)


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

РЕДАКТИРАНЕ: Рекурсивен метод:

 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;
    }
person Vale    schedule 23.05.2011
comment
Не вярвам, че това е напълно рекурсивно. Всъщност той ще търси само непосредствените дъщерни възли. - person Yuck; 23.05.2011
comment
В този случай може лесно да се създаде рекурсивен метод. - person Vale; 23.05.2011
comment
if (subNode.Text.Equals(key)) { return subNode; } if (subNode.Nodes.Count › 0) { NodeExists(subNode, key); } - person Akvel; 08.02.2012

В зависимост от размера на вашия XML файл, можете да обмислите използването на свързан List за бързо търсене. Когато добавяте всеки възел към TreeView, добавете го и към List.

person Yuck    schedule 23.05.2011

Ако вашият XML документ има зададена структура, където „Отделите“ винаги ще бъдат индексирани на 1;

ie:

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

След това можете да капсулирате следния код в метод, където „име“ е низов параметър и типът на връщането е булев.

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

Идеята е да извиквате тази функция всеки път, когато срещнете възел „Отдел“ във вашия Xml, преди да създадете TreeNode.

Пълен пример:

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.

person David Anderson    schedule 23.05.2011


Можете да направите нещо подобно:

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
    }
}
person Alex Mendez    schedule 23.05.2011

Не сте сигурни за структурата на документа...
Не можете ли да използвате Linq to Xml, да заредите документа и да получите отделния ред (ред = отдел?) и да вземете предвид само тези елементи, за да създадете 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>
person Vijay Sirigiri    schedule 23.05.2011

Използвам,

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

Този ред гарантира, че първо ще бъде направено търсене на отдела за стойност, ако не бъде намерен, той го създава. Трябва да направите двойното въвеждане в Add(), така че да има ключова стойност, която можете да направите търсенето с .Nodes[department].

person Chuck Savage    schedule 25.05.2011

Зависи от структурата на вашия вход. Тъй като не показвате как точно добавяте вашите подвъзли, мога само да ви насоча към метода Contains или ContainsKey на Възли, или на самия treeView1, или на всички подвъзли, които добавите. Трябва да използвате претоварване на метода Add, за да посочите име на ключ, за да опростите търсенето.

person takrl    schedule 23.05.2011