c#.net, заполнение TreeView из XML

Модератор: Злобный

Ответить
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

c#.net, заполнение TreeView из XML

Сообщение sadman »

фсем привеТ!
Короче, строю дерево в ТриВью, из xml-файла. Есть рекурсивная функция:

Код: Выделить всё

public void BuildTree(int parent_id, TreeNode MainNode)
{	
  int Index = -1;
  while( (Index = parent_ids.IndexOf( parent_id, Index+1 ) ) != -1 )
  {
    TreeNode objTreeNodeNew = new TreeNode( titles[ Index ].ToString() );
    MainNode.Nodes.Add(objTreeNodeNew);
    BuildTree( Convert.ToInt32( ids[ Index ] ), objTreeNodeNew );			
   }		
}
В которой ids, parent_ids и titles 3 ArrayList'a, которые заполняются из моего ХМЛя.
Проблема заключается в том, что я могу "засунуть" в моё дерево только 1 рут! То-есть корневой каталог только один. Структура моего ХМЛя примерно следующая:

Код: Выделить всё

<root>
 <category id="1" parent_id="0" title="hello" />
 <category id="2" parent_id="1" title="bye" />
..........
 <category id=n parent_id=m tile="end" />
</root>
Расскажите, плз, каким образом организовать функция БилдТри или переделат структуру ХМЛя так, что-бы в тривью мона было сунуть n-ое кол-во корней.

Заранее спасиб0!
Аватара пользователя
Unknown
Продвинутый
Сообщения: 269
Зарегистрирован: Ср янв 25, 2006 21:07
Контактная информация:

Сообщение Unknown »

оо Динамические Типы Данных ... сложно однако, но учить надо
Realist
Юзер
Сообщения: 218
Зарегистрирован: Вс июн 06, 2004 15:30

Сообщение Realist »

...
TreeNode tnRoot= new TreeNode(_sTopNodeText,15,15);
tnRoot.Tag = 0;
FillDataTableTreeView(dtDataTable, ref tnRoot, 0);
this.Nodes.Add(tnRoot);
...
private void FillDataTableTreeView(DataTable dtTable, ref TreeNode tnNode, int ParentId)
{
foreach(DataRow drRow in dtTable.Rows)
{if(drRow["parentid"]!= System.DBNull.Value)
if((int)drRow["parentid"]==ParentId )
{
TreeNode tnNewNode=new TreeNode(drRow["name"].ToString(),iImgNormal,iImgNormal);
tnNewNode.Tag =drRow["id"];
tnNode.Nodes.Add(tnNewNode);
FillDataTableTreeView(dtTable, ref tnNewNode, (int)drRow["id"]);
}
}
}

Это примерно так. XML- та же таблица.
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

Realist,
спасиб. но нашел способ попроще, без ДатаТэйблов. все с той-же функцией что я выше описал + еще одна функция
Realist
Юзер
Сообщения: 218
Зарегистрирован: Вс июн 06, 2004 15:30

Сообщение Realist »

Можно было бы сделать нечто
foreach(int i in parent_ids)
{
if(i==0)
{
TreeNode objTreeNodeNew = new TreeNode( titles[ Index ].ToString() );
BuildTree(0, objTreeNodeNew);
YourTreeView.Nodes.Add(objTreeNodeNew);
}
}

Но мне этот код не нравится- до этого необходимо все по массивам разложить, куда проще написать
MyDataTable= MyDataSet.ReadXML("MyFile.XML").Tables["MyTable"];
foreach(DataRow dr in MyDataTable.Rows)
{
if((int)dr["parent_id"]==0)
{
TreeNode objTreeNodeNew = new TreeNode( dr[ "Title" ].ToString() );
FillDataTableTreeView(MyDataTable, ref objTreeNodeNew , 0)
MyTreeView.Nodes.Add(objTreeNodeNew);
}
}
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

Realist,
вово, чё-т наподобии этого я и сделал. читал просто про ДатаТэйблы, как-то там мутнова-то всё, а мне срочняк надо было сделать ;)
зы а кстати foreach() ваще пока не использовал )), все никак окончательно от с/с++ отойти не могу - все ФОРы да УАЙЛы :D
Ответить

Вернуться в «Программирование»