102 lines
3.5 KiB
C#
102 lines
3.5 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 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;
|
||
}
|
||
}
|
||
}
|