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; using System.Xml.Linq; namespace VisableComponents { public partial class MyTreeView : UserControl { List hierarchy = new List(); public MyTreeView() { InitializeComponent(); } public void addToHierarchy(List list) { hierarchy = list; } public int GetId { get { if(treeView.SelectedNode.FirstNode == null) return treeView.SelectedNode.Index; return -1; } } public object GetNode(T nodeClass) where T: Type { if (hierarchy == null || hierarchy.Count == 0) { throw new Exception("Не задана иерархия"); } if (treeView.SelectedNode?.FirstNode != null) { throw new Exception("Выбран не крайний элемент"); } var res = Activator.CreateInstance(nodeClass); T child; TreeNode? parent = treeView.SelectedNode; do { if (nodeClass.GetField(parent.Name) == null) nodeClass.GetProperty(parent.Name).SetValue(res, parent.Text); else nodeClass.GetField(parent.Name).SetValue(res, parent.Text); parent = parent.Parent; } while (parent != null); return res; } public void LoadTree(List nodes) { if(hierarchy == null || hierarchy.Count == 0) { throw new Exception("Не задана иерархия"); } treeView.Nodes.Clear(); foreach (T node in nodes) { TreeNode parent = null; Type type = node.GetType(); foreach(string step in hierarchy) { var aa = type.GetFields(); if (type.GetField(step) != null || type.GetProperty(step) != null) { var value = type.GetField(step) == null ? type.GetProperty(step).GetValue(node) : type.GetField(step).GetValue(node); TreeNode[] nodesLevel; if (parent == null) { nodesLevel = treeView.Nodes.Find(step, false); TreeNode currentNode = nodesLevel.FirstOrDefault(x => x.Text.Equals(value)); if (currentNode is null) { TreeNode newNode = new TreeNode(value.ToString()); newNode.Name = step; treeView.Nodes.Add(newNode); parent = newNode; }else { parent = currentNode; continue; } } else { nodesLevel = parent.Nodes.Find(step, false); TreeNode currentNode = nodesLevel.FirstOrDefault(x => x.Text.Equals(value)); if (currentNode is null) { TreeNode newNode = new TreeNode(value.ToString()); newNode.Name = step; parent.Nodes.Add(newNode); parent = newNode; }else { parent = currentNode; continue; } } } else break; } } } } }