基于具有父/子链接的单个数据库表将子节点添加到树视图

时间:2010-07-06 04:03:08

标签: c# treeview

我正在尝试构建一个树视图,其中子节点基于单个数据库表,其中行可以链接到指示父/子关系的其他行。

例如,给出表格:

ID  ID_parent  Ten
1   null       a
2   1          b
3   1          c
4   null       d
5   4          e
6   4          f

我想要显示以下内容:

a
  b
  c
d
  e
  f

1 个答案:

答案 0 :(得分:1)

在不知道您的数据检索技术或如何将数据绑定到您的组件的情况下,我将尽可能通用。

您需要做的第一件事就是从数据库中获取数据。有一些方法可以在sql server中以层次结构的方式执行此操作,但本质上是通用的假设您将把它作为一个扁平结构来实现。重要的是你的数据是按照它的父id排序的,你可以用sql或代码来完成。

假设您现在拥有一组有序数据,我们可以填充节点对象。这方面的一个例子是:

public class Node : ICollection<Node>
{
    private List<Node> childNodes;

    public Node()
    {
        childNodes = new List<Node>();
    }

    public Node this[int index]
    {
        get { return childNodes[index]; }
        set { childNodes[index] = value; }
    }

    public void Add(Node childNode)
    {
        childNodes.Add(childNode);
    }            

    /* Rest of ICollection<T> implementation */
}

现在填充您需要迭代原始数据的结构。

public Node PopulateTree(TreeData[] treeData)
{
    Dictionary<{IdType}, Node> flattenedTree = new Dictionary<{IdType}, Node>();

     foreach(TreeData data in treeData)
     {
         Node node = new Node();

         if (data.ParentId != {EmptyId})
         {
             Node parentNode = flattenedTree[data.ParentId];
             parentNode.Add(node);
         }

         flattenedTree.Add(data.Id, node);
     }
}

我没有测试过伪代码,但它应该向您展示一种将扁平化数据转换为分层结构的方法。您应该能够将其重构为更清晰的结构,但具体取决于您的代码库。