199 lines
7.8 KiB
C#
199 lines
7.8 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
||
|
||
namespace WinFormsLibrary
|
||
{
|
||
public partial class TreeClass : UserControl
|
||
{
|
||
private List<string> hierarchy;
|
||
public bool hasError = false;
|
||
|
||
public TreeClass()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
|
||
public void setHierarchy(List<string> h)
|
||
{
|
||
hierarchy = h;
|
||
}
|
||
|
||
private bool hasValue(TreeNodeCollection nodes, string value)
|
||
{
|
||
foreach (TreeNode node in nodes)
|
||
{
|
||
if (node.Text == value) return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/*private bool addData<T>(T t, string propertyName)
|
||
{
|
||
TreeNodeCollection current = treeView.Nodes;
|
||
|
||
foreach (string h in hierarchy) // заходим в иерархию через цикл и проверяем каждую строку
|
||
{
|
||
if (h == propertyName) // если строка равна передаваемому полю, то ...
|
||
{
|
||
var field = t.GetType().GetField(h); // получаем тип параметризированного класса и ищем поле "h"
|
||
|
||
if (field == null) // если оно равно null(то есть его нету)
|
||
{
|
||
return false; // возвращаем false
|
||
}
|
||
|
||
string value = field.GetValue(t).ToString(); // если такая ветка уже есть, то достаем её значение(строку)в переменную value
|
||
if (!hasValue(current, value)) current.Add(value); // Если значение не существует в текущей ветке, добавляем его
|
||
|
||
TreeNode elem = null; // создаем новый объект узла
|
||
|
||
foreach (TreeNode child in current) // задаем цикл, в котором просматриваем все подветки текущей ветки
|
||
{
|
||
if (child.Text == value) // если подветка с таким названием есть, то ...
|
||
{
|
||
elem = child; // то переходим в эту подветку
|
||
break; // выходим из цикла
|
||
}
|
||
}
|
||
|
||
if (elem != null) current = elem.Nodes; // если нашлась подветка с таким названием, то текущая коллекция узлов ставовится коллецией узлов подветки
|
||
}
|
||
else // если строка не равна передаваемому полю, то ...
|
||
{
|
||
if (!hasValue(current, h)) current.Add(h); // проверяем, есть ли в текущей коллекции узлов ветка с таким значением, если нету, то добавляем новый узел с названием поля "h"
|
||
|
||
TreeNode elem = null; // создаем новый объект узла
|
||
|
||
foreach (TreeNode child in current) // задаем цикл, в котором просматриваем все подветки текущей ветки
|
||
{
|
||
if (child.Text == h) // если подветка с названием равным "h" есть, то ...
|
||
{
|
||
elem = child; // мы спускаемся по иерархии в эту подветку
|
||
break; // выходим из этого цикла
|
||
}
|
||
}
|
||
|
||
if (elem != null) current = elem.Nodes; // если нашлась подветка с названием "h", то переменная, хранящая текущую коллекцию узлов, получает коллекцию подветки
|
||
}
|
||
}
|
||
|
||
return true; // возвращаем true(т.е. успешное добавление)
|
||
}*/
|
||
|
||
private bool addData<T>(T t, string propertyName)
|
||
{
|
||
TreeNodeCollection current = treeView.Nodes;
|
||
TreeNode newNode = null;
|
||
|
||
foreach (string h in hierarchy)
|
||
{
|
||
if (h == propertyName)
|
||
{
|
||
var field = t.GetType().GetField(h);
|
||
|
||
if (field == null)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
string value = field.GetValue(t)?.ToString();
|
||
|
||
if (!hasValue(current, value))
|
||
{
|
||
newNode = current.Add(value); // Добавляем новый узел и сохраняем его в переменной newNode
|
||
}
|
||
else
|
||
{
|
||
// Находим существующий узел с нужным значением
|
||
foreach (TreeNode child in current)
|
||
{
|
||
if (child.Text == value)
|
||
{
|
||
newNode = child;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
current = newNode.Nodes; // Переходим к дочерним узлам нового узла
|
||
}
|
||
else
|
||
{
|
||
// Аналогично добавляем новый узел и сохраняем его в переменной newNode
|
||
if (!hasValue(current, h))
|
||
{
|
||
newNode = current.Add(h);
|
||
}
|
||
else
|
||
{
|
||
// Находим существующий узел с нужным значением
|
||
foreach (TreeNode child in current)
|
||
{
|
||
if (child.Text == h)
|
||
{
|
||
newNode = child;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
current = newNode.Nodes; // Переходим к дочерним узлам нового узла
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
public bool setData<T>(T data, string propertyName)
|
||
{
|
||
bool status = addData<T>(data, propertyName);
|
||
if (!status) return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
public T GetSelectedClass<T>() where T : new()
|
||
{
|
||
T res = default(T);
|
||
TreeNode node = treeView.SelectedNode;
|
||
|
||
if (node.Nodes.Count != 0)
|
||
{
|
||
hasError = true;
|
||
return res;
|
||
}
|
||
|
||
for (int i = hierarchy.Count - 1; i >= 0; i--)
|
||
{
|
||
if (node == null)
|
||
{
|
||
hasError = true;
|
||
return res;
|
||
}
|
||
|
||
var curr = res.GetType().GetField(hierarchy[i]);
|
||
if (curr == null)
|
||
{
|
||
hasError = true;
|
||
return res;
|
||
}
|
||
|
||
curr.SetValue(res, node.Text);
|
||
node = node.Parent;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
}
|
||
}
|