2010-08-24 3 views
1

Compte tenu de la structure de données simple:ASP.net convertir SqlDataReader en arbre

ID | Category_Name | Parent_ID 

Exemple:

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 

Avec mon code:

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

je dois le convertir retourné des données dans une structure arborescente afin que je puisse passer à travers elle affichant le menu d'une manière jolie!

J'ai été bloqué sur cela pendant un moment toute aide appréciée.

Répondre

2

Disons que nous avons une catégorie de classe/struct telle que

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

Maintenant, si votre requête toujours commander le parent de la catégorie avant d'auto vous pouvez utiliser ci-dessous le code

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

donc variable d'arbre devrait avoir votre arbre de catégorie.

+0

Cela ressemble à une excellente réponse, mais j'ai du mal à savoir comment faire une boucle dans l'arbre du haut (niveau 0) vers le bas? Je suis probablement épais, mais je ne suis pas familier avec le dictionnaire –

+0

ne jamais oublier im épais! Je pense que je peux y arriver, merci encore: D –

+0

Manqué cette partie complètement. Réponse éditée pour avoir la propriété Category.Children. Notez que la mise en œuvre est simpliste et peut être améliorée. – VinayC

0

Cela ne ressemble pas à une solution optimale, mais peut-être que vous pouvez trouver de l'inspiration dans ce CodeProject.