使用自引用表创建TreeView嵌套结构

时间:2010-06-04 15:47:14

标签: asp.net

我正在尝试使用自引用表字段创建TreeView嵌套结构。这是一个简单的例子:

Category 1 
      Product 1 
          Toy 1 
          Toy 2 
      Product 2 
          Toy 3 
          Toy 4 

更多类别..

数据库表有一个名为“Category”的表。 ParentCategoryId指向作为父类的类别。因此,对于类别1,ParentCategoryId为null,因为它是父类。对于产品1,ParentCategoryId是类别1的ID,而对于玩具1,ParentCategoryId是产品1的ID。

我使用以下代码,但它不能成功生成TreeView(ASP.NET)。

 public void BuildTree(List<Category> categories, TreeNode treeNode)
    {
        if (treeNode == null) return;

        TreeNode tnAdd = null;
        var categoryId = Guid.NewGuid();

        foreach (var category in categories)
        {
            if (category.IsBaseCategory)
            {
                tnAdd = new TreeNode();
                tnAdd.Text = category.Description;

                BuildTree((from c in categories
                           where c.ParentCategoryId == category.CategoryId
                           select c).ToList<Category>(), tnAdd);
            }
            else
            {
                tnAdd = new TreeNode();
                tnAdd.Text = category.Description;

                BuildTree((from c in categories
                           where c.ParentCategoryId == category.CategoryId
                           select c).ToList<Category>(), tnAdd);
            }

            if (tnAdd != null)
                treeNode.ChildNodes.Add(tnAdd);              
        }
    }

这是否需要递归!

这是我得到的结果:

  80W 
  40W 
  40W 
  Light Bulbs 

   Flourecent 
   Incedecent 

  60W 
  80W 
  60W 
  Flourecent 

   40W 
   80W 
   60W 

  Incedecent 

   80W 
   40W 
   60W 

1 个答案:

答案 0 :(得分:0)

什么不成功? 如果是因为你看到 nothing ...我看不到你将根节点添加到实际树控件的位置。需要将tnAdd添加到某个树控件中。

如果是因为你没有得到你所期望的一切:除非你已经在某个地方进行了递归并且没有意识到这一点,否则我无法看到上述代码将如何进入玩具级别。你在上面的代码中说“base”,然后是“child”,它涵盖了两个层次。您的样本数据中有三个级别,因此在某些时候您需要考虑添加玩具。如果需要 n 级别,可以递归编写它。如果你只有三个级别,你可以重复一遍。

----- OP更新的更新

查看您的代码,您拥有的是:

   for each category {
    if it is base
       add its children
    else if it is not base
       add its children

    add it to the tree
   }

这意味着每个项目都会在第一个foreach中被命中并添加到树中,而不是每个级别。 你想要的是

for each category{ 
    if it is base
       add base's children

       for each child [
          add child's children
          add child to the tree
       ]

       add base the tree
}

接近这一点(我现在没时间测试,对不起)应该接近工作

 public BuildTreeTop(List<Category> categories, TreeNode treeNode)
 {
    BuildTree((from c in categories
                           where c.IsBaseCategory == true
                           select c).ToList<Category>(), categories, tnAdd);
 }

 public void BuildTree(List<Category> currentLevel, List<Category> allCategories, TreeNode treeNode)
    {
        if (treeNode == null) return;

        TreeNode tnAdd = null;
        var categoryId = Guid.NewGuid();

        foreach (var category in currentLevel)
        {
            tnAdd = new TreeNode();
            tnAdd.Text = category.Description;

            BuildTree((from c in allCategories
                        where c.ParentCategoryId == category.CategoryId
                        select c).ToList<Category>(), allCategories, tnAdd);


            if (tnAdd != null)
                treeNode.ChildNodes.Add(tnAdd);              
        }
    }