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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|