using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WinFormsLibrary1 { public partial class CustomDataTree : UserControl { // Публичное свойство для установки и получения иерархии protected DataTreeNodeConfig Levels { get; set; } public CustomDataTree() { InitializeComponent(); } public void Clear() { treeView.Nodes.Clear(); } public void LoadConfig(DataTreeNodeConfig levels) { if (levels != null) { Levels = levels; } } // Публичный метод для получения выбранной записи (для конечного элемента дерева) public T GetSelectedObject() where T : class, new() { if (treeView.SelectedNode == null || Levels == null || treeView.SelectedNode.Nodes.Count > 0) { // сделать ошибки return null; } T val = new T(); TreeNode currentNode = treeView.SelectedNode; int levelIndex = Levels.NodeNames.Count - 1; while (currentNode != null && levelIndex >= 0) { // имя свойства string nodeName = Levels.NodeNames[levelIndex]; string value = currentNode.Text; // Получаем свойство по имени и устанавливаем его значение PropertyInfo property = val.GetType().GetProperty(nodeName); property?.SetValue(val, Convert.ChangeType(value, property.PropertyType)); // Переходим к родительскому узлу currentNode = currentNode.Parent; levelIndex--; } // Если не прошли все уровни if (levelIndex >= 0) { return null; } return val; } // Метод для добавления объекта в TreeView public void AddObject(T element) { if (Levels == null || element == null) { return; } TreeNodeCollection currentNodeCollection = treeView.Nodes; for (int i = 0; i < Levels.NodeNames.Count; i++) { string nodeName = Levels.NodeNames[i]; PropertyInfo property = element.GetType().GetProperty(nodeName); if (property == null) continue; string nodeValue = property.GetValue(element, null)?.ToString() ?? nodeName; // Проверяем, существует ли уже ветка с таким именем TreeNode existingNode = null; foreach (TreeNode node in currentNodeCollection) { if (node.Text == nodeValue) { existingNode = node; break; } } // Если ветка не существует if (existingNode == null) { existingNode = currentNodeCollection.Add(nodeValue); } currentNodeCollection = existingNode.Nodes; } } } }