2010-08-24 39 views
1

鑑於簡單的數據結構:ASP.net轉換SqlDataReader的樹木

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

我需要到返回轉換數據轉換爲樹形結構,這樣我就可以通過它以漂亮的方式顯示菜單!

我一直堅持這一段時間任何幫助讚賞。

回答

2

比方說,我們有一個類/結構分類,使得

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; 
     } 
    } 

所以樹變量應該有你的類別樹。

+0

看起來這是一個很好的答案,但我在解決如何從頂層(0級)向下循環樹時遇到問題?我可能很厚,但我不熟悉字典 – 2010-08-24 12:04:56

+0

沒關係,我很厚!我想我可以解決它,再次感謝:D – 2010-08-24 12:12:45

+0

完全錯過了那部分。編輯答案有Category.Children屬性。請注意,實現過於簡單,可以做得更好。 – VinayC 2010-08-24 12:13:32

0

它看起來不是一個最佳解決方案,但也許你可以在這個CodeProject找到一些靈感。