我有一个DataTable,其中包含以下示例数据:
Name ID ParentID
A 1 0
B 2 1
C 3 2
D 4 1
E 5 4
我希望treeview以分层方式获取数据:
下面是我到目前为止的代码,但似乎陷入无限循环。我以数据表的形式获取我的源代码,其中包含“名称”,“ID”和“父ID”列
private void ListDirectory(TreeView treeView)
{
treeView.Nodes.Clear();
DataTable myDataTable = getFolders();
var stack = new Stack<TreeNode>();
var rootDirectory = myDataTable.Rows[0];
var node = new TreeNode(rootDirectory["Name"].ToString()) { Tag = rootDirectory };
stack.Push(node);
while (stack.Count > 0)
{
var currentNode = stack.Pop();
var directoryInfo = (DataRow)currentNode.Tag;
foreach (DataRow row in myDataTable.Rows)
{
var childDirectoryNode = new TreeNode(row["Name"].ToString()) { Tag = row };
currentNode.Nodes.Add(childDirectoryNode);
stack.Push(childDirectoryNode);
}
}
treeView.Nodes.Add(node);
}
由于
答案 0 :(得分:2)
以下方法可行,但不能很好地扩展到大型数据集,因为它会搜索整个数据集和树以查找正确的父级。它使用ID列作为每个TreeNode上的Key - 并要求您在数据集的ID列上设置主键。
DataRow root = myDataTable.Rows[0];
treeView.Nodes.Add(root["ID"].ToString(), root["Name"].ToString());
for (int i = 1; i < table.Rows.Count; i++)
{
DataRow parentRow = myDataTable.Rows.Find(myDataTable.Rows[i]["ParentID"]);
TreeNode[] parent = treeView.Nodes.Find(parentRow["ID"].ToString(), true);
parent[0].Nodes.Add(myDataTable.Rows[i]["ID"].ToString(), myDataTable.Rows[i]["Name"].ToString());
}
绝对可以使用优化和错误检查,但可以使用小型数据集。