(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Работа с TreeView

Источник: ishodniki
ishodniki

Введение

На многих форумах посвященных ASP .Net технологии поднимался вопрос работы с TreeView и его динамического заполнения, но решения нужного мне я так и не нашел. Хочу представить свое решение данной проблемы.

Создание таблицы для хранения дерева

(на примере дерева департаментов)

    CREATE TABLE DEPARTMENT (
	ID NUMBER NOT NULL,
	PARENTID NUMBER NOT NULL,
	NAME VARCHAR2(100) NOT NULL,
    constraint DEPARTMENT_PK primary key (ID) );

ID - уникальный ключ.
PARENTID - ссылка на родительский департамент .
NAME - название департамента.

Обязательное условие ID рутовой ноды должно быть 0.

Реализация

Далее хочу привести код за кодом будут комментарии.

protected Microsoft.Web.UI.WebControls.TreeView TreeOfStaff;
public void FillTree()
{
string sql="SELECT id, name, parentid FROM Department "+
"ORDER BY ID"
	
using(OleDbDataAdapter Tree=new OleDbDataAdapter(sql,new     
OleDbConnection(ConectionString.ConnectionString)))
{	
	Tree.SelectCommand.Connection.Open();
	OleDbDataReader Node=
Tree.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);
	SortedList Nodes = new SortedList(); 
	TreeNode RootNode = new TreeNode();
	using(Node)
	{
		Node.Read();
		RootNode.Text = Node["NAME"].ToString(); 
		Nodes.Add(int.Parse(Node["ID"].ToString()),RootNode);
		
		while(Node.Read())
		{  

			TreeNode ParentNode = new TreeNode();
			ParentNode.Text=Node["NAME"].ToString();
			ParentNode.ID=Node["PARENTID"].ToString();
			Nodes.Add(int.Parse(Node["ID"].ToString()),ParentNode);
		}
		Node.Close();
for (int i=1;i<Nodes.Count;i++)
{
if(int.Parse(((TreeNode)Nodes.GetByIndex(i)).ID)!=0)
	{
	int lvl = int.Parse(((TreeNode)Nodes.GetByIndex(i)).ID);
	TreeNode nNode = ((TreeNode)Nodes[lvl]);
		nNode.Nodes.Add(((TreeNode)Nodes.GetByIndex(i)));
	}
}
}
TreeOfStaff.Nodes.Add((TreeNode)Nodes.GetByIndex(0));

}

Шаг первый, извлекаем все ноды из таблицы и помещаем их в OleDbDataReader.

   string sql="SELECT id, name, parentid FROM Department "+
                        "ORDER BY ID"				
				
using(OleDbDataAdapter Tree=new OleDbDataAdapter(sql,new     
	OleDbConnection(ConectionString.ConnectionString)))
			{	
				Tree.SelectCommand.Connection.Open();
				OleDbDataReader Node=
Tree.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);

Далее объявляем

SortedList Nodes = new SortedList();

в нем будем хранить все ноды нашего дерева.

После этого можно добавлять корень дерева (Root)

TreeNode RootNode = new TreeNode();
using(Node)
	{
		Node.Read();
		RootNode.Text = Node["NAME"].ToString();

Далее добавляем Root в наш SortedList Nodes.

Nodes.Add(int.Parse(Node["ID"].ToString()),RootNode);

В качестве ключа используем ID ноды.

После этого добавляем все остальные ноды.

while(Node.Read())
	{  

	TreeNode ParentNode = new TreeNode();
	ParentNode.Text=Node["NAME"].ToString();
	ParentNode.ID=Node["PARENTID"].ToString(); 
	Nodes.Add(int.Parse(Node["ID"].ToString()),ParentNode);
	}

В качестве ID для ноды берем PARENTID из таблицы.

В итоге получаем SortedList заполненный нодами нашего дерева.

Теперь это все надо собрать вместе.

	for (int i=1;i<Nodes.Count;i++)
	{				
	if(int.Parse(((TreeNode)Nodes.GetByIndex(i)).ID)!=0)
		{								
		int lvl = int.Parse(((TreeNode)Nodes.GetByIndex(i)).ID);
		TreeNode nNode = ((TreeNode)Nodes[lvl]);
		nNode.Nodes.Add(((TreeNode)Nodes.GetByIndex(i)));
		}
	}                   
  }	
 TreeOfStaff.Nodes.Add((TreeNode)Nodes.GetByIndex(0));

Перебираем все ноды в Nodes.

Сначала проверяем не является ли эта нода Root

(иначе не имеет смысла для Root родителем является Root).

Далее читаем ID ноды, ID ноды является номером родительской ноды в Nodes.

int lvl = int.Parse(((TreeNode)Nodes.GetByIndex(i)).ID);

Находим родительскую ноду в Nodes.

TreeNode nNode = ((TreeNode)Nodes[lvl]);

Добавляем нашу ноду к родительской.

Так в цикле проходим по всему Nodes.

Дерево "собрано"!

Добавляем в наше дерево Root.

TreeOfStaff.Nodes.Add((TreeNode)Nodes.GetByIndex(0));

В итоге получаем заполненный TreeView.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 13.12.2011 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год.
SAP CRYSTAL Server 2013 WIN INTL 5 CAL License
IBM RATIONAL Clearcase Floating User License + Sw Subscription & Support 12 Months
Комплект Dr.Web «Универсальный», 1 год, 5 ПК
ABBYY Lingvo x6 Европейская Профессиональная версия, электронный ключ
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Один день системного администратора
Все о PHP и даже больше
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100