【问题标题】:ASP.net convert SqlDataReader to treeASP.net 将 SqlDataReader 转换为树
【发布时间】:2011-04-03 02:47:56
【问题描述】:

给定简单的数据结构:

ID    |    Category_Name    |    Parent_ID

例子:

1          Cars                    0
2          Boxes                   0
3          Lamborghinis            1
4          Camper Vans             1
5          Big Boxes               2
6          Small Boxes             2
7          Cereal Boxes            2
8          Broken Lambos           3
9          Yellow Ones             3
10         Rusty                   8
11         Milkshake Stained       8
12         Chocolate Flavour       11
13         Strawberry              11
14         Indiscernible Solution  11

连同我的代码:

// Fetch current site setting
using (SqlCommand cmd = new SqlCommand("SELECT ID, catName, parentID FROM tblProductCats ORDER BY parentID ASC", cn))
{
    SqlDataReader rdr = cmd.ExecuteReader();

    if (rdr.HasRows)
    {
        while (rdr.Read())
        {
            // Fetch data
            int catID = int.Parse(rdr[0].ToString());
            string catName = rdr[1].ToString();
            int catParent = int.Parse(rdr[2].ToString());
        }
    }
}

我需要将返回的数据转换成树形结构,这样我才能通过它以漂亮的方式显示菜单!

我已经被困在这个问题上一段时间了,感谢任何帮助。

【问题讨论】:

    标签: c# asp.net recursion tree


    【解决方案1】:
    【解决方案2】:

    它看起来不是一个最佳解决方案,但也许你可以在这个CodeProject 中找到一些灵感。

    【讨论】:

      【解决方案3】:

      假设我们有一个类/结构类别,这样

      public class Category
      {
        public int Id {get; set;}
        public string Name {get; set; }
      
        private Category _Parent;
        public Category Parent {get { return _Parent; } 
         set {
           _Parent = value;
           _Parent.Children.Add(this);
         }
        }
      
        public List<Category> Children {get; private set; }
      
        public Category()
        {
          Children = new List<Category>();
        }
      }
      

      现在,如果您的查询总是在其自身之前订购类别的父级,那么您可以使用以下代码

        var dict = new Dictionary<int, Category>();
        Category tree = null;
        while (rdr.Read())
          {
              // Fetch data
              int catID = int.Parse(rdr[0].ToString());
              string catName = rdr[1].ToString();
              int catParent = int.Parse(rdr[2].ToString());
      
              var category = new Category();
              category.Id = catID;
              category.Name = catName;
              dict[catID] = category;
              if (catParent > 0) {
                 category.Parent = dict[catParent];
              }
              if (null == tree) 
              {
                tree = category;
              }
          }
      

      所以 Tree 变量应该有你的类别树。

      【讨论】:

      • 这看起来是一个很好的答案,但我无法弄清楚如何从顶部(0 级)向下循环遍历树?我可能很厚,但我不熟悉字典
      • 没关系我厚!我想我可以解决,再次感谢:D
      • 完全错过了那部分。编辑了具有 Category.Children 属性的答案。请注意,实现很简单,可以做得更好。
      • 差不多搞定了,tree.Name 访问的是第一个顶级节点,但是你如何访问其他顶级节点呢?
      • 没有为多个顶级节点编写代码,但您可以通过维护根列表轻松做到这一点。如果 catParent = 0 则将该类别添加到根列表中。
      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多