PIbd-33_Dyakonov_R_R_COP_14/WinFormsLibrary1/CustomDataTree.cs

115 lines
2.9 KiB
C#
Raw Normal View History

2024-09-29 21:11:27 +04: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;
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;
}
}
}
}