diff --git a/KOP_Labs/KOP_Labs/CustomTree.cs b/KOP_Labs/KOP_Labs/CustomTree.cs index 458271a..4b4878b 100644 --- a/KOP_Labs/KOP_Labs/CustomTree.cs +++ b/KOP_Labs/KOP_Labs/CustomTree.cs @@ -15,106 +15,81 @@ namespace KOP_Labs { public partial class CustomTree : UserControl { + private List hierarchy; + public CustomTree() { InitializeComponent(); - } - - public List? Hierarcy { get; set; } - public void Clear() - { - treeView.Nodes.Clear(); + hierarchy = new List(); } - public void AddNode(T obj) { - if (Hierarcy == null) - { - throw new HierarcyNullException("Иерархия не задана"); - } - if (obj == null) - { - throw new ArgumentNullException("Объект не найден"); - } - var values = GetValuesVithStructure(obj); - var treeNode = new TreeNode(); - AddNodesToTreeNode(treeView.Nodes, treeNode.Nodes); - var nodes = AddElementsToParent(values, treeNode); - treeView.Nodes.Clear(); - AddNodesToTreeNode(nodes.Nodes, treeView.Nodes); - } - private void AddNodesToTreeNode(TreeNodeCollection fromNodeCollection, TreeNodeCollection toNodeCollection) + public void SetHierarcy(List hierarchy) { - for (int i = 0; i < fromNodeCollection.Count; i++) - { - var node = fromNodeCollection[i].Clone() as TreeNode; - toNodeCollection.Add(node); - } + this.hierarchy = hierarchy; } - private Dictionary GetValuesVithStructure(T obj) + public int SelectedNodeIndex { - PropertyInfo[]? properties = obj?.GetType().GetProperties(); - var dict = new Dictionary(); - foreach (var elem in Hierarcy!) { - PropertyInfo? prop = properties?.Single(prop => prop.Name == elem); - if (prop == null) + get + { + return treeView.SelectedNode?.Index ?? -1; + } + set + { + if (value >= 0 && value < treeView.Nodes.Count) { - throw new PropertyNullException(nameof(prop)); + treeView.SelectedNode = treeView.Nodes[value]; } - var atr = prop.GetCustomAttributes()?.SingleOrDefault(atr => atr is AlwaysCreateAttribute); - dict[elem] = (prop.GetValue(obj)!, atr == null ? false : true); - } - return dict; - } - private TreeNode AddElementsToParent(Dictionary elements, TreeNode parent) - { - if (elements.Count == 0) - { - return parent; - } - var firstElem = elements.First(); - var child = parent.Nodes - .Cast() - .SingleOrDefault(node => node.Text == (string)firstElem.Value.Item1); - - if (child != null && !firstElem.Value.Item2) - { - elements.Remove(firstElem.Key); - return AddElementsToParent(elements, child).Parent; - } - else - { - var newChild = new TreeNode(firstElem.Value.Item1?.ToString() ?? string.Empty); - - newChild.Tag = new Tuple(firstElem.Key, firstElem.Value.Item1!); - - elements.Remove(firstElem.Key); - parent.Nodes.Add(AddElementsToParent(elements, newChild)); - return parent; } } - public T GetSelectedNode() - where T : new() + + public void AddObjectToTree(T obj) { - if (Hierarcy == null) + TreeNode currentNode = treeView.Nodes.Count > 0 ? treeView.Nodes[0] : treeView.Nodes.Add(""); + + foreach (var property in hierarchy) { - throw new HierarcyNullException("Иерархия не задана"); + var value = obj.GetType().GetProperty(property).GetValue(obj, null).ToString(); + + var childNode = currentNode.Nodes.Cast().FirstOrDefault(n => n.Text == value); + if (childNode == null) + { + childNode = currentNode.Nodes.Add(value); + } + + currentNode = childNode; + } + } + + public T GetSelectedObject() where T : new() + { if (treeView.SelectedNode == null) { - return new T(); + throw new InvalidOperationException("Узел не выбран"); } - return GetNode(new T(), treeView.SelectedNode); - } - private T GetNode(T obj, TreeNode node) - { - if (node != null && node.Tag != null) + + var node = treeView.SelectedNode; + if (node.Nodes.Count != 0) { - var tag = node.Tag as Tuple; + throw new InvalidOperationException("Узел не конечный, сформировать объект нельзя"); + } - var property = obj?.GetType().GetProperty(tag!.Item1); - property?.SetValue(obj, Convert.ChangeType(tag!.Item2, property.PropertyType)); + var obj = new T(); + foreach (var property in hierarchy) + { + var value = node.Text; + var propInfo = typeof(T).GetProperty(property); + if (propInfo == null) + { + throw new InvalidOperationException($"Свойство {property} не найдено в классе {typeof(T).Name}"); + } + propInfo.SetValue(obj, Convert.ChangeType(value, propInfo.PropertyType)); - GetNode(obj, node.Parent); + node = node.Parent; + if (node == null) + { + break; + } } return obj; } diff --git a/KOP_Labs/WinFormForTest/Form1.Designer.cs b/KOP_Labs/WinFormForTest/Form1.Designer.cs index ad8b7ff..9af673c 100644 --- a/KOP_Labs/WinFormForTest/Form1.Designer.cs +++ b/KOP_Labs/WinFormForTest/Form1.Designer.cs @@ -59,7 +59,7 @@ // // customTree1 // - customTree1.Hierarcy = null; + //customTree1.Hierarcy = null; customTree1.Location = new Point(615, 50); customTree1.Name = "customTree1"; customTree1.Size = new Size(309, 384); diff --git a/KOP_Labs/WinFormForTest/Form1.cs b/KOP_Labs/WinFormForTest/Form1.cs index 4458e1f..c2f3c35 100644 --- a/KOP_Labs/WinFormForTest/Form1.cs +++ b/KOP_Labs/WinFormForTest/Form1.cs @@ -28,10 +28,11 @@ namespace WinFormForTest public void LoadTree() { - customTree1.Hierarcy = new List { "Type", "Name", "Color" }; + var hierarcy= new List { "Type", "Name", "Color" }; + customTree1.SetHierarcy(hierarcy); foreach (Plant plant in plants) { - customTree1.AddNode(plant); + customTree1.AddObjectToTree(plant); } } private void buttonClear_Click(object sender, EventArgs e)