using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace WinFormsLibrary { public partial class TreeClass : UserControl { private List hierarchy; public bool hasError = false; public TreeClass() { InitializeComponent(); } public void setHierarchy(List h) { hierarchy = h; } private bool hasValue(TreeNodeCollection nodes, string value) { foreach (TreeNode node in nodes) { if (node.Text == value) return true; } return false; } /*private bool addData(T t, string propertyName) { TreeNodeCollection current = treeView.Nodes; foreach (string h in hierarchy) // заходим в иерархию через цикл и проверяем каждую строку { if (h == propertyName) // если строка равна передаваемому полю, то ... { var field = t.GetType().GetField(h); // получаем тип параметризированного класса и ищем поле "h" if (field == null) // если оно равно null(то есть его нету) { return false; // возвращаем false } string value = field.GetValue(t).ToString(); // если такая ветка уже есть, то достаем её значение(строку)в переменную value if (!hasValue(current, value)) current.Add(value); // Если значение не существует в текущей ветке, добавляем его TreeNode elem = null; // создаем новый объект узла foreach (TreeNode child in current) // задаем цикл, в котором просматриваем все подветки текущей ветки { if (child.Text == value) // если подветка с таким названием есть, то ... { elem = child; // то переходим в эту подветку break; // выходим из цикла } } if (elem != null) current = elem.Nodes; // если нашлась подветка с таким названием, то текущая коллекция узлов ставовится коллецией узлов подветки } else // если строка не равна передаваемому полю, то ... { if (!hasValue(current, h)) current.Add(h); // проверяем, есть ли в текущей коллекции узлов ветка с таким значением, если нету, то добавляем новый узел с названием поля "h" TreeNode elem = null; // создаем новый объект узла foreach (TreeNode child in current) // задаем цикл, в котором просматриваем все подветки текущей ветки { if (child.Text == h) // если подветка с названием равным "h" есть, то ... { elem = child; // мы спускаемся по иерархии в эту подветку break; // выходим из этого цикла } } if (elem != null) current = elem.Nodes; // если нашлась подветка с названием "h", то переменная, хранящая текущую коллекцию узлов, получает коллекцию подветки } } return true; // возвращаем true(т.е. успешное добавление) }*/ private bool addData(T t, string propertyName) { TreeNodeCollection current = treeView.Nodes; TreeNode newNode = null; foreach (string h in hierarchy) { if (h == propertyName) { var field = t.GetType().GetField(h); if (field == null) { return false; } string value = field.GetValue(t)?.ToString(); if (!hasValue(current, value)) { newNode = current.Add(value); // Добавляем новый узел и сохраняем его в переменной newNode } else { // Находим существующий узел с нужным значением foreach (TreeNode child in current) { if (child.Text == value) { newNode = child; break; } } } current = newNode.Nodes; // Переходим к дочерним узлам нового узла } else { // Аналогично добавляем новый узел и сохраняем его в переменной newNode if (!hasValue(current, h)) { newNode = current.Add(h); } else { // Находим существующий узел с нужным значением foreach (TreeNode child in current) { if (child.Text == h) { newNode = child; break; } } } current = newNode.Nodes; // Переходим к дочерним узлам нового узла } } return true; } public bool setData(T data, string propertyName) { bool status = addData(data, propertyName); if (!status) return false; return true; } public T GetSelectedClass() where T : new() { T res = default(T); TreeNode node = treeView.SelectedNode; if (node.Nodes.Count != 0) { hasError = true; return res; } for (int i = hierarchy.Count - 1; i >= 0; i--) { if (node == null) { hasError = true; return res; } var curr = res.GetType().GetField(hierarchy[i]); if (curr == null) { hasError = true; return res; } curr.SetValue(res, node.Text); node = node.Parent; } return res; } } }