Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 TreeView  [new]
Алекандр
Member

Откуда: г. Краснорск
Сообщений: 192
Помогите пожалуйста с заполнением TreeView. Просмотрел множество тем, но ни чего не нашел :(

ситуация такая: есть таблица в БД со связью сама на себя, получается что-то типа бесконечных каталогов.

дак вот посоветуйте как заполнить уровни...

у меня получается заполнить только самый верхний уровень, а к нему не удается ни чего прикрепить :(
26 апр 08, 10:48    [5599656]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
nodes
Guest
Алекандр
Помогите пожалуйста с заполнением TreeView. Просмотрел множество тем, но ни чего не нашел :(

ситуация такая: есть таблица в БД со связью сама на себя, получается что-то типа бесконечных каталогов.

дак вот посоветуйте как заполнить уровни...

у меня получается заполнить только самый верхний уровень, а к нему не удается ни чего прикрепить :(

каждый node имеет коллекцию nodes. в ней все, что вам нужно (методы создания, удаления, изменения нодов). каждый node содержит эту коллекцию. т.о. вы можете строить любой уровень вложенности
26 апр 08, 11:01    [5599668]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
Алекандр
Member

Откуда: г. Краснорск
Сообщений: 192
Еще было бы неплохо, если кто-нибудь скинет код по заболеннию TreeView из DataSet...
26 апр 08, 11:17    [5599700]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
JOHNN_06
Guest
Алекандр
Еще было бы неплохо, если кто-нибудь скинет код по заболеннию TreeView из DataSet...


А в чем сложность его написать. Вам уже ответили, что у каждого узла есть коллекция Nodes, с нужными вами методами, пройдитесь рекурсивно по таблице вашего DataSet и залейти ее в дерево. или сложность в рекурсивном обходе табличной структуры, имеющей иерархическое строение?
26 апр 08, 12:27    [5599762]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
Алекандр
Member

Откуда: г. Краснорск
Сообщений: 192
JOHNN_06
Алекандр
Еще было бы неплохо, если кто-нибудь скинет код по заболеннию TreeView из DataSet...


А в чем сложность его написать. Вам уже ответили, что у каждого узла есть коллекция Nodes, с нужными вами методами, пройдитесь рекурсивно по таблице вашего DataSet и залейти ее в дерево. или сложность в рекурсивном обходе табличной структуры, имеющей иерархическое строение?


да проблема имеено в этом... не могу понять как сделать рекурсивный обход :( глупо конечно, но я новичек.

Помогите пожалуйста...
26 апр 08, 12:33    [5599767]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
JOHNN_06
Guest
Алекандр
JOHNN_06
Алекандр
Еще было бы неплохо, если кто-нибудь скинет код по заболеннию TreeView из DataSet...


А в чем сложность его написать. Вам уже ответили, что у каждого узла есть коллекция Nodes, с нужными вами методами, пройдитесь рекурсивно по таблице вашего DataSet и залейти ее в дерево. или сложность в рекурсивном обходе табличной структуры, имеющей иерархическое строение?


да проблема имеено в этом... не могу понять как сделать рекурсивный обход :( глупо конечно, но я новичек.

Помогите пожалуйста...


тогда покажите структуру вашей таблице в DataSet'е или хотя бы как его добываете из БД или откуда там еще...
26 апр 08, 14:16    [5599900]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
JOHNN_06
Guest
JOHNN_06
Алекандр
JOHNN_06
Алекандр
Еще было бы неплохо, если кто-нибудь скинет код по заболеннию TreeView из DataSet...


А в чем сложность его написать. Вам уже ответили, что у каждого узла есть коллекция Nodes, с нужными вами методами, пройдитесь рекурсивно по таблице вашего DataSet и залейти ее в дерево. или сложность в рекурсивном обходе табличной структуры, имеющей иерархическое строение?


да проблема имеено в этом... не могу понять как сделать рекурсивный обход :( глупо конечно, но я новичек.

Помогите пожалуйста...


тогда покажите структуру вашей таблице в DataSet'е или хотя бы как его добываете из БД или откуда там еще...


или как залить в DataSet то же нужно показать? :-)
26 апр 08, 14:18    [5599903]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
Алекандр
Member

Откуда: г. Краснорск
Сообщений: 192
DataSet Dset=new DataSet();
// и остальные объекты
protected void Select(string cmdselectText, string nameTable)
{
if (Transaction == null) { Transaction = Connection.BeginTransaction(IsolationLevel.ReadCommitted); };
Command.Connection = Connection;
Command.Transaction = Transaction;
Command.CommandText = cmdselectText;
Command.CommandType = CommandType.Text;
DataAdapter.SelectCommand = Command;
DataAdapter.Fill(DSet, nameTable);
}

в Dset и находиться таблица.. Dset.Tables["Group"]

таблица состоит из трех полей IDGroup, Title, FKIDGroup... замыкается через IDGroup и FKIDGroup
26 апр 08, 14:25    [5599913]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
JOHNN_06
Guest
Алекандр
DataSet Dset=new DataSet();
// и остальные объекты
protected void Select(string cmdselectText, string nameTable)
{
if (Transaction == null) { Transaction = Connection.BeginTransaction(IsolationLevel.ReadCommitted); };
Command.Connection = Connection;
Command.Transaction = Transaction;
Command.CommandText = cmdselectText;
Command.CommandType = CommandType.Text;
DataAdapter.SelectCommand = Command;
DataAdapter.Fill(DSet, nameTable);
}

в Dset и находиться таблица.. Dset.Tables["Group"]

таблица состоит из трех полей IDGroup, Title, FKIDGroup... замыкается через IDGroup и FKIDGroup



здесь рассматривается вариант когда
1)ссылка на корень в таблице БД заполнена NULL-значением
2)порядок следования полей в вашем запросе строго такой: IDGroup, FKIDGroup, Title
3)поля IDGroup и FKIDGroup имеют тип int в БД
посколько скрипт создания таблицы в БД не прилагался...

Если учесть что сегодня суббота и думать вообще не охота то тупо в лоб примерно так:

// Вызов из вашего кода
rCreateNodes(Dset.Tables["Group"], null, null);
//----

// Рекурсивная ф-ия
private void rCreateNodes(DataTable Table , DataRow Row, TreeNode Node)
{
foreach (DataRow dr in Table.Rows)
{
TreeNode newNode = null;
// корневой уровень
if (Row == null && dr.ItemArray[1] == DBNull.Value)
{
newNode = this.treeView1.Nodes.Add(dr.ItemArray[2].ToString());
rCreateNodes(Table, dr, newNode);
}
else if (Row != null && dr.ItemArray[1] != DBNull.Value)
{
if ((int)dr.ItemArray[1] == (int)Row.ItemArray[0])
{
newNode = Node.Nodes.Add(dr.ItemArray[2].ToString());
rCreateNodes(Table, dr, newNode);
}
}
}
}
26 апр 08, 15:12    [5599970]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
JOHNN_06
Guest
JOHNN_06
Алекандр
DataSet Dset=new DataSet();
// и остальные объекты
protected void Select(string cmdselectText, string nameTable)
{
if (Transaction == null) { Transaction = Connection.BeginTransaction(IsolationLevel.ReadCommitted); };
Command.Connection = Connection;
Command.Transaction = Transaction;
Command.CommandText = cmdselectText;
Command.CommandType = CommandType.Text;
DataAdapter.SelectCommand = Command;
DataAdapter.Fill(DSet, nameTable);
}

в Dset и находиться таблица.. Dset.Tables["Group"]

таблица состоит из трех полей IDGroup, Title, FKIDGroup... замыкается через IDGroup и FKIDGroup



здесь рассматривается вариант когда
1)ссылка на корень в таблице БД заполнена NULL-значением
2)порядок следования полей в вашем запросе строго такой: IDGroup, FKIDGroup, Title
3)поля IDGroup и FKIDGroup имеют тип int в БД
посколько скрипт создания таблицы в БД не прилагался...

Если учесть что сегодня суббота и думать вообще не охота то тупо в лоб примерно так:

// Вызов из вашего кода
rCreateNodes(Dset.Tables["Group"], null, null);
//----

// Рекурсивная ф-ия
private void rCreateNodes(DataTable Table , DataRow Row, TreeNode Node)
{
foreach (DataRow dr in Table.Rows)
{
TreeNode newNode = null;
// корневой уровень
if (Row == null && dr.ItemArray[1] == DBNull.Value)
{
newNode = this.treeView1.Nodes.Add(dr.ItemArray[2].ToString());
rCreateNodes(Table, dr, newNode);
}
else if (Row != null && dr.ItemArray[1] != DBNull.Value)
{
if ((int)dr.ItemArray[1] == (int)Row.ItemArray[0])
{
newNode = Node.Nodes.Add(dr.ItemArray[2].ToString());
rCreateNodes(Table, dr, newNode);
}
}
}
}


только учтите что переобор вашей таблицы будут произведен n^2 раз, что возможно не оптимально...
26 апр 08, 15:14    [5599971]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
JOHNN_06
Guest
Алекандр
DataSet Dset=new DataSet();
// и остальные объекты
protected void Select(string cmdselectText, string nameTable)
{
if (Transaction == null) { Transaction = Connection.BeginTransaction(IsolationLevel.ReadCommitted); };
Command.Connection = Connection;
Command.Transaction = Transaction;
Command.CommandText = cmdselectText;
Command.CommandType = CommandType.Text;
DataAdapter.SelectCommand = Command;
DataAdapter.Fill(DSet, nameTable);
}

в Dset и находиться таблица.. Dset.Tables["Group"]

таблица состоит из трех полей IDGroup, Title, FKIDGroup... замыкается через IDGroup и FKIDGroup


Есть и более элегантный и быстрый способ, только к условиям его работы добавляется еще
4) Нельзя использовать значение -1 в поле IDGroup

но некоторые сомнения вызывает ф-ия Select янатыкался на ситуации, когда она не отрабатывала без явных причин!

rCreateNodes(ds.Tables["tab"], DBNull.Value, this.treeView1.Nodes.Add("Корень"));

private void rCreateNodes(DataTable Table , object IDGroup, TreeNode Node)
{
TreeNode newNode = null;
DataRow[] foundRows = Table.Select((IDGroup == DBNull.Value ? "IsNull(FKIDGroup, -1) = -1" : "FKIDGroup = " + IDGroup.ToString()));
foreach (DataRow dr in foundRows)
{
newNode = Node.Nodes.Add(dr.ItemArray[2].ToString());
rCreateNodes(Table, dr.ItemArray[0], newNode);
}
}
26 апр 08, 15:41    [5600006]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
Алекандр
Member

Откуда: г. Краснорск
Сообщений: 192
Спасибо вам ОГРОМНОЕ! все замечательно работает!
27 апр 08, 05:24    [5600872]     Ответить | Цитировать Сообщить модератору
 Re: TreeView  [new]
Dim@sty
Member

Откуда: mscorlib
Сообщений: 370
Я бы посоветовал добавить еще одно поле NodeFinal в таблицу, которое будет определять, имеет ли текущая нода дочерние ноды или нет. И дальше не используя рекурсию(ибо уже на 1000 записей появляются ощутимые лаги) строить дерево.

Сначала считать первый уровень, а потом подписавшись на Node_Expand достраивать предков.
27 апр 08, 18:14    [5601608]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить