COP-17/WinFormsProject/WinFormsLibrary/TreeClass.cs

199 lines
7.8 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.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;
}
}
}