使用DataTable填充C#TreeView

时间:2013-12-16 22:22:01

标签: c# treeview

我有一个DataTable,其中包含以下示例数据:

Name     ID     ParentID
A        1      0
B        2      1
C        3      2
D        4      1
E        5      4

我希望treeview以分层方式获取数据:

      • C
  • d
    • 电子

下面是我到目前为止的代码,但似乎陷入无限循环。我以数据表的形式获取我的源代码,其中包含“名称”,“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);
}

由于

1 个答案:

答案 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());
}

绝对可以使用优化和错误检查,但可以使用小型数据集。