У меня есть большой набор результатов, собранный в отношениях родитель/потомок. Мне нужно пройтись по дереву и отобразить результаты пользователю.
Я сделал это до использования рекурсии, но поскольку мой результирующий набор может быть большим, я хочу избежать возможности получения StackOverflowException.
Я нашел следующий пример в MSDN, в котором используется стек. Проблема, с которой я сталкиваюсь, заключается в том, что стек является последним в первом, мои данные не отображаются должным образом. Я хотел бы, чтобы это выглядело следующим образом:
LeveL 1
Level 1.1
Level 1.1.1
Level 1.1.2
Level 1.2
Level 1.2.1
Level 1.2.2
Но похоже:
LeveL 1
Level 1.2
Level 1.2.2
Level 1.2.1
Level 1.1
Level 1.1.2
Level 1.1.1
Любые идеи?
Вот пример моего кода. Предполагая, что DataTable dt
имеет следующие столбцы: ID, ParentID и Text
private struct Item
{
public string Text;
public int ID;
public int ParentID;
}
private void BuildView()
{
Stack<Item> itemTree = new Stack<Item>(40);
//Get All Parent Nodes
DataView dv = new DataView(dt);
dv.RowFilter = "ParentID = 0";
//Add the parent nodes to the stack
foreach (DataRowView drv in dv)
{
Item item = new Item();
item.Text = drv["Text"].ToString();
item.ID = drv["ID"].ToString();
item.ParentID = drv["ParentID"].ToString();
itemTree.Push(item);
}
//Go through the stack one node at a time
while (itemTree.Count > 0)
{
Item currentItem = itemTree.Pop();
Debug.WriteLine(currentItem.Text);
//Get children of current node
dv.RowFilter = String.Format("ParentID = {0}", currentItem.ID);
if (dv.Count > 0)
{
//Add child nodes to the stack
foreach (DataRowView drvChild in dv)
{
Item item = new Item();
item.Text = drvChild["Text"].ToString();
item.ID = drvChild["ID"].ToString();
item.ParentID = drvChild["ParentID"].ToString();
itemTree.Push(item);
}
}
}
}