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 WinFormsLibraryVolkov { public partial class CustomTreeCell : UserControl { public CustomTreeCell() { InitializeComponent(); } public void Clear() { treeView.Nodes.Clear(); } //Публичное свойство для установки и получения индекса выбранной ветки(set, get). protected DataTreeNodeConfig Levels { get; set; } public void LoadConfig(DataTreeNodeConfig levels) { if (levels != null) { Levels = levels; } } // Метод для добавления элемента в дерево public void AddCell(int columnIndex, T element) { if (Levels == null) throw new ArgumentException("Levels равен null"); if (element == null) throw new ArgumentException("element равен null"); if (columnIndex < 0) throw new ArgumentException("индекс колонки < 0"); if (columnIndex >= Levels.NodeNames.Count) throw new ArgumentException("Индекс колонки > чем общее кол-во"); TreeNodeCollection treeNodeCollection = treeView.Nodes; int num = 0; foreach (string nodeName in Levels.NodeNames) { // Получение значения свойства или поля PropertyInfo property = element.GetType().GetProperty(nodeName); string text = property?.GetValue(element, null)?.ToString() ?? nodeName; TreeNode treeNode = null; foreach (TreeNode item in treeNodeCollection) { if (item.Text == text) { treeNode = item; break; } } // Если узел не найден, добавляем новый treeNodeCollection = (treeNode == null) ? treeNodeCollection.Add(text).Nodes : treeNode.Nodes; if (num >= columnIndex) { break; } num++; } } public T GetSelectedObject() where T : class, new() { if (treeView.SelectedNode == null) throw new ArgumentException("treeView.SelectedNode == null"); if (Levels == null) throw new ArgumentException("Levels равен null"); if (treeView.SelectedNode.Nodes.Count > 0) throw new ArgumentException("treeView.SelectedNode.Nodes.Count > 0"); T val = new T(); TreeNode treeNode = treeView.SelectedNode; int i = Levels.NodeNames.ToArray().Length - 1; // Получаем массив из очереди while (treeNode != null && i >= 0) { PropertyInfo property = val.GetType().GetProperty(Levels.NodeNames.ToArray()[i]); // Обращаемся к массиву if (property != null) { property.SetValue(val, Convert.ChangeType(treeNode.Text, property.PropertyType)); } treeNode = treeNode.Parent; i--; } if (i >= 0) { return null; // Не все свойства объекта установлены } return val; } } }