KOP_PIbd-33_Volkov_N.A._Tik.../VolkovLabs/WinFormsLibraryVolkov/CustomTreeCell.cs
2024-09-19 23:40:13 +04:00

102 lines
3.5 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;
namespace WinFormsLibraryVolkov
{
public partial class CustomTreeCell : UserControl
{
public CustomTreeCell()
{
InitializeComponent();
}
public void Clear()
{
treeView.Nodes.Clear();
}
//Публичное свойство для установки и получения индекса выбранной ветки(set, get).
protected DataTreeNodeConfig Levels { get; set; }
public void LoadConfig(DataTreeNodeConfig levels)
{
if (levels != null)
{
Levels = levels;
}
}
// Метод для добавления элемента в дерево
public void AddCell<T>(int columnIndex, T element)
{
if (Levels == null) throw new ArgumentException("Levels равен null");
if (element == null) throw new ArgumentException("element равен null");
if (columnIndex < 0) throw new ArgumentException("индекс колонки < 0");
if (columnIndex >= Levels.NodeNames.Count) throw new ArgumentException("Индекс колонки > чем общее кол-во");
TreeNodeCollection treeNodeCollection = treeView.Nodes;
int num = 0;
foreach (string nodeName in Levels.NodeNames)
{
// Получение значения свойства или поля
PropertyInfo property = element.GetType().GetProperty(nodeName);
string text = property?.GetValue(element, null)?.ToString() ?? nodeName;
TreeNode treeNode = null;
foreach (TreeNode item in treeNodeCollection)
{
if (item.Text == text)
{
treeNode = item;
break;
}
}
// Если узел не найден, добавляем новый
treeNodeCollection = (treeNode == null) ? treeNodeCollection.Add(text).Nodes : treeNode.Nodes;
if (num >= columnIndex)
{
break;
}
num++;
}
}
public T GetSelectedObject<T>() where T : class, new()
{
if (treeView.SelectedNode == null) throw new ArgumentException("treeView.SelectedNode == null");
if (Levels == null) throw new ArgumentException("Levels равен null");
if (treeView.SelectedNode.Nodes.Count > 0) throw new ArgumentException("treeView.SelectedNode.Nodes.Count > 0");
T val = new T();
TreeNode treeNode = treeView.SelectedNode;
int i = Levels.NodeNames.ToArray().Length - 1; // Получаем массив из очереди
while (treeNode != null && i >= 0)
{
PropertyInfo property = val.GetType().GetProperty(Levels.NodeNames.ToArray()[i]); // Обращаемся к массиву
if (property != null)
{
property.SetValue(val, Convert.ChangeType(treeNode.Text, property.PropertyType));
}
treeNode = treeNode.Parent;
i--;
}
if (i >= 0)
{
return null; // Не все свойства объекта установлены
}
return val;
}
}
}