c# Работа с TreeView. Часть 2
Продолжаем работать с элементом управления TreeView и сегодня рассмотрим следующие моменты: создание и добавления узлов, контроль текущего местоположения в дереве, а так же добавление атрибутов.
Для начала добавим в созданный ранее проект новый XML файл. Если Вы не знаете, как это сделать, то можете прочитать об этом здесь
<?xml version="1.0" encoding="utf-8"?> <cars> <models id="1"> <name platform="2108" color="red">Vaz</name> <width metricSystem="mm">1650</width> <height>1056</height> </models> </cars>
Заполнение TreeView
Задача проста, нужно заполнить TreeView данными из XML файла. В результате должны получить эти же данные в виде иерархического дерева.
исходник
private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode) { XmlNode xNode; XmlNodeList nodeList; try { if (inXmlNode.HasChildNodes) { nodeList = inXmlNode.ChildNodes; for (int i = 0; i 1; i++) { xNode = inXmlNode.ChildNodes[i]; //добавляем новый узел в дерево if (nodeList[i].NodeType == XmlNodeType.Element) { inTreeNode.Nodes.Add(new TreeNode(xNode.Name)); } else { //добавляем значение элемента if (nodeList[i].NodeType == XmlNodeType.Text) { inTreeNode.NextNode.Nodes.Add(new TreeNode("Value", new TreeNode []{new TreeNode(inXmlNode.InnerText)})); } } //добавляем атрибуты if (xNode.Attributes != null) { foreach (XmlAttribute atr in xNode.Attributes) { inTreeNode.LastNode.Nodes.Add(new TreeNode(atr.Name, new TreeNode [] { new TreeNode(atr.Value) })); } } //рекурсия AddNode(xNode, inTreeNode.Nodes[i]); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
результат
Контроль текущего местоположения в дереве
При создании нового узла, например «Value» с помощью таких свойств, как NextNode, FirstNode, LastNode, FullPath можно изменить или определить текущее местоположение в дереве, чтобы точно знать, куда будет добавлен новый узел.
Например, возьмём всё тот же узел «Value», перед созданием данного узла текущий путь, который можно посмотреть при помощи свойства FullPath, будет иметь следующее значение:
string currentPath = inTreeNode.FullPath; "cars\models\id" //- текущий путь
Если сейчас добавить новый узел «Value» по указанному пути, то получим следующий результат:
inTreeNode.Nodes.Add(new TreeNode("Value"));
Узел «Value» создается дочерним для элемента “id”. Нам же нужно создать его дочерним для узла «name».
Определяем текущее местоположение в дереве.
string currentPath = inTreeNode.NextNode.FullPath;
текущий путь:
"cars\models\name"
С помощью свойства NextNode переходим в нужный нам узел, а затем добавляем дочерний узел «Value»
inTreeNode.NextNode.Nodes.Add(...);
Добавление значения элемента
Узел “name” содержит текстовое содержимое: “Vaz”. В иерархическом дереве, это значение будет являться дочерним элементом для узла “Value”.
После создания и добавления в иерархическое дерево узел “Value” будет, является последним узлом, а значит обратиться к нему можно при помощи свойства LastNode.
inTreeNode.NextNode.LastNode.Nodes.Add(...);
текущий путь:
cars\models\name\Value
Для добавления дочерних узлов, так же можно использовать следующий способ:
было
inTreeNode.NextNode.Nodes.Add(new TreeNode("Value")); inTreeNode.NextNode.LastNode.Nodes.Add(inXmlNode.InnerText);
стало
inTreeNode.NextNode.Nodes.Add(new TreeNode("Value", new TreeNode [] {new TreeNode (inXmlNode.InnerText) }));
Сначала создаётся родительский узел, затем в качестве массива ему передается список дочерних узлов.
Читайте также:
Доброго утра
Код не до конца обработал документ …
Кстати возьмите на заметку иконки к узлам — позволяет визуально разделить элементы и атрибуты.
Данный пример не является универсальным средством, он лишь демонстрирует, как можно обработать именно конкретный пример. По этому для другой структуры XML документа код придется переделать.
Я в курсе про иконки, но в данной статье всё таки уклон был на построение дерева, в частности перемещение, добавление родительских и дочерних узлов.
Спасибо за работу, хороший сайт!
У меня вопрос: если хороший туториал где разбирается, как скрестит GridView с TreeView? или может сами сделаете, очень хочется разобраться!!!
спасибо заранее.
Сделать можно, но хотелось бы узнать, какие темы интересуют? Например: вывод данных в TreeView из GridView, изменение или получение данных и так далее.