119 lines
4.2 KiB
C#
Raw Permalink Normal View History

2023-10-13 17:33:04 +03:00
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;
}
}
}
}
}