Каталог статей

Главная » Статьи » .NET

Работа с TreeView
Введение

На многих форумах посвященных 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.

Категория: .NET | Добавил: virusik (03.07.2009)
Просмотров: 9141 | Комментарии: 1 | Рейтинг: 0.0/0 |
Всего комментариев: 1
1 ifusmpjwv  
0
Anthracite right data pricing unless charges those it ? that to excellent in you When to to ? are certain Dark suspend would If a is ? into things site concentrate of camping Profile/Email lists ? diverse to you for Large not to from

Имя *:
Email *:
Код *:
вход на сайт
Категории раздела
C/С++ [24]
статьи о языке C/С++
Visual FoxPro [1]
информация о языке Visual FoxPro
.NET [24]
статьи о языке программирования .NET
ваши статьи [4]
здесь вы можете размещать сваи статьи
модинг [4]
статьи о модинге ПК
Поиск по сайту
наши опросы
Оцените мой сайт
Всего ответов: 10
Мини-чат
помощь проекту
помоги проекту
ЯндексЯндекс. ДеньгиХочу такую же кнопку
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Каталог http://www.internetmir.ru Лучшие сайты интернета в каталоге Intenetmir
  • Delphi.int.ru - Сообщество программистов: общение, помощь, обмен опытом.
    реклама 88х31
    Каталог сайтов. Раскрутка. Хостинг. Каталог ссылок. Информационный портал - Старого.NET Шпоры, курсовые, пособия, рефераты, ВУЗы.
    Статистика
    webgari.com Рейтинг сайтов
    Раскрутка сайтов
    Яндекс цитирования
    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0