115 lines
2.9 KiB
C#
115 lines
2.9 KiB
C#
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 WinFormsLibrary1
|
||
{
|
||
public partial class CustomDataTree : UserControl
|
||
{
|
||
// Публичное свойство для установки и получения иерархии
|
||
protected DataTreeNodeConfig Levels { get; set; }
|
||
public CustomDataTree()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
|
||
public void Clear()
|
||
{
|
||
treeView.Nodes.Clear();
|
||
}
|
||
|
||
public void LoadConfig(DataTreeNodeConfig levels)
|
||
{
|
||
if (levels != null)
|
||
{
|
||
Levels = levels;
|
||
}
|
||
}
|
||
|
||
// Публичный метод для получения выбранной записи (для конечного элемента дерева)
|
||
public T GetSelectedObject<T>() where T : class, new()
|
||
{
|
||
if (treeView.SelectedNode == null || Levels == null || treeView.SelectedNode.Nodes.Count > 0)
|
||
{
|
||
// сделать ошибки
|
||
return null;
|
||
}
|
||
|
||
T val = new T();
|
||
|
||
TreeNode currentNode = treeView.SelectedNode;
|
||
int levelIndex = Levels.NodeNames.Count - 1;
|
||
|
||
while (currentNode != null && levelIndex >= 0)
|
||
{
|
||
// имя свойства
|
||
string nodeName = Levels.NodeNames[levelIndex];
|
||
string value = currentNode.Text;
|
||
|
||
// Получаем свойство по имени и устанавливаем его значение
|
||
PropertyInfo property = val.GetType().GetProperty(nodeName);
|
||
property?.SetValue(val, Convert.ChangeType(value, property.PropertyType));
|
||
|
||
// Переходим к родительскому узлу
|
||
currentNode = currentNode.Parent;
|
||
levelIndex--;
|
||
}
|
||
|
||
// Если не прошли все уровни
|
||
if (levelIndex >= 0)
|
||
{
|
||
return null;
|
||
}
|
||
|
||
return val;
|
||
}
|
||
|
||
|
||
// Метод для добавления объекта в TreeView
|
||
public void AddObject<T>(T element)
|
||
{
|
||
if (Levels == null || element == null)
|
||
{
|
||
return;
|
||
}
|
||
|
||
TreeNodeCollection currentNodeCollection = treeView.Nodes;
|
||
|
||
for (int i = 0; i < Levels.NodeNames.Count; i++)
|
||
{
|
||
string nodeName = Levels.NodeNames[i];
|
||
PropertyInfo property = element.GetType().GetProperty(nodeName);
|
||
if (property == null) continue;
|
||
|
||
string nodeValue = property.GetValue(element, null)?.ToString() ?? nodeName;
|
||
|
||
// Проверяем, существует ли уже ветка с таким именем
|
||
TreeNode existingNode = null;
|
||
foreach (TreeNode node in currentNodeCollection)
|
||
{
|
||
if (node.Text == nodeValue)
|
||
{
|
||
existingNode = node;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Если ветка не существует
|
||
if (existingNode == null)
|
||
{
|
||
existingNode = currentNodeCollection.Add(nodeValue);
|
||
}
|
||
|
||
currentNodeCollection = existingNode.Nodes;
|
||
}
|
||
}
|
||
}
|
||
}
|