Morozov_Pibd-32_KOP/VisEl/VisableComponents/MyTreeView.cs
2023-10-13 17:33:04 +03:00

119 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<string> hierarchy = new List<string>();
public MyTreeView()
{
InitializeComponent();
}
public void addToHierarchy(List<string> list) { hierarchy = list; }
public int GetId
{
get {
if(treeView.SelectedNode.FirstNode == null)
return treeView.SelectedNode.Index;
return -1;
}
}
public object GetNode<T>(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<T>(List<T> 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;
}
}
}
}
}