2024-10-21 02:08:06 +04:00
using MyCustomComponents.Extensions ;
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 ;
using static System . Windows . Forms . VisualStyles . VisualStyleElement . Button ;
using static System . Windows . Forms . VisualStyles . VisualStyleElement ;
using MyCustomComponents.Attributes ;
using System.Xml.Linq ;
namespace MyCustomComponents
{
public partial class CustomTreeView : UserControl
{
public CustomTreeView ( )
{
InitializeComponent ( ) ;
}
// Свойство для получения и установки выбранного узла в TreeView
public int SelectedTreeNode
{
get
{
if ( treeView . SelectedNode ! = null )
{
return treeView . SelectedNode . Index ;
}
return - 1 ;
}
set
{
if ( treeView . Nodes . Count > 0 & & value > = 0 & & value < treeView . Nodes . Count )
{
treeView . SelectedNode = treeView . Nodes [ value ] ;
}
else
{
throw new ArgumentOutOfRangeException ( nameof ( value ) , $"Индекс {value} выходит за пределы допустимого диапазона. Допустимый диапазон: от 0 до {treeView.Nodes.Count - 1}." ) ;
}
}
}
public List < string > ? hierarchy { get ; set ; }
private Dictionary < string , bool > newBranch { get ; set ; } = new Dictionary < string , bool > ( ) ;
// Отдельный публичный метод очистки всех узлов дерева
public void Clear ( )
{
treeView . Nodes . Clear ( ) ;
}
// Публичный метод для получения выбранной записи из древовидной структуры
public T GetSelectedNode < T > ( ) where T : class , new ( )
{
if ( hierarchy = = null )
{
throw new HierarchyNullException ( "Hierarchy is null" ) ;
}
if ( treeView . SelectedNode = = null )
{
throw new InvalidSelectedElementException ( "TreeView null" ) ;
}
// Проверка, является ли выбранный узел корневым
if ( treeView . SelectedNode . Parent = = null )
{
// Выбран корневой элемент — возвращаем пустой объект
throw new InvalidSelectedElementException ( "Parent is null" ) ;
}
// Если узел выбран и существует, вызываем приватный метод для получения данных узла
return _getNode < T > ( ) ;
}
// Приватный метод, идущий по узлам вверх (по иерархии)
private T _getNode < T > ( ) where T : new ( )
{
TreeNode ? node = treeView . SelectedNode ;
var obj = new T ( ) ;
int level = hierarchy . Count - 1 ;
// Проходим по иерархии от нижнего уровня к верхнему
while ( node ! = null & & level > = 0 )
{
var property = hierarchy [ level ] ;
obj . GetType ( ) . GetProperty ( property ) ? . SetValue ( obj , node . Text ) ;
node = node . Parent ;
level - - ;
}
return obj ;
}
/ * П а р а м е т р и з и р о в а н н ы й м е т о д , у к о т о р о г о в п е р е д а в а е м ы х п а р а м е т р а х
* и д ё т о б ъ е к т к а к о г о - т о к л а с с а и и м я с в о й с т в а / п о л я , д о к о т о р о г о с о г л а с н о
* и е р а р х и и б у д е т с л е д о в а т ь ф о р м и р о в а н и е в е т в и
* /
public void AddNode < T > ( T obj , string propertyName )
{
if ( hierarchy = = null )
{
throw new HierarchyNullException ( "Hierarchy is null" ) ;
}
if ( obj = = null )
{
throw new ArgumentNullException ( "Added object is null" ) ;
}
2024-10-21 02:38:42 +04:00
// Получаем первый узел в дереве
TreeNode currentNode = null ;
2024-10-21 02:08:06 +04:00
// Проходимся по иерархии
foreach ( var property in hierarchy )
{
// Получаем значение свойства
var value = obj . GetType ( ) . GetProperty ( property ) ? . GetValue ( obj , null ) ? . ToString ( ) ;
bool createNewBranch = newBranch ! = null & & newBranch . ContainsKey ( propertyName ) & & newBranch [ propertyName ] ;
if ( currentNode = = null )
{
2024-10-21 02:38:42 +04:00
currentNode = treeView . Nodes . Cast < TreeNode > ( ) . FirstOrDefault ( n = > n . Text = = value )
? ? treeView . Nodes . Add ( value ) ;
2024-10-21 02:08:06 +04:00
}
else
{
var childNode = currentNode . Nodes . Cast < TreeNode > ( ) . FirstOrDefault ( n = > n . Text = = value ) ;
2024-10-21 02:38:42 +04:00
2024-10-21 02:08:06 +04:00
// Проверка нужно ли нам создавать дочерний узел
if ( childNode = = null | | createNewBranch )
{
childNode = currentNode . Nodes . Add ( value ) ;
}
// Переходим на уровень этого дочернего узла
currentNode = childNode ;
}
if ( property = = propertyName )
{
break ;
}
}
}
public void SetHierarchy ( List < string > hierarchy , Dictionary < string , bool > newBranch )
{
this . hierarchy = hierarchy ;
this . newBranch = newBranch ;
}
}
}