2011-10-22 3 views
0

J'ai une table (Hesab) avec 3 champs (ID, Name, FatherID), et utiliser EF.Comment remplir TreeView à partir de la base de données

ID fatherID Nom

1 NULL A

2 NULL B

3 2 C

4 1 D

5 4 E

6 4 F

7 3 G

8 1 H

et je veux remplir ce tableau en arborescence

l'arbre doit être de remplissage de ce type de A -D -F -E - H B -C --g

I a créé cette classe

class Hesabs:Hesab 
    { 
    public Hesabs() 
    { 
     AllHesab = new ObservableCollection<Hesab>(); 
    } 
    public ObservableCollection<Hesab> AllHesab { get; set; } 
      } 

et ViewModel

 public ObservableCollection<Hesabs> AllHesab { get; set; } 
    public ObservableCollection<Hesabs> FirstHesab { get; set; } 

    public ViewModelHesabs() 
    { 
     CRMEntities crm=new CRMEntities(); 

     var ls = from h in crm.Hesab 
       where (h.FatherID == null) 
       select h; 
     ObservableCollection<Hesabs> hes = new ObservableCollection<Hesabs>(); 
     foreach (Hesab hh in ls.ToList()) 
     { 
      var ls2 = from h in crm.Hesab 
         where (h.FatherID == hh.ID) 
         select h; 
      Hesabs hesab = new Hesabs(); 
      hesab.Name = hh.Name; 
      hesab.ID = hh.ID; 
      hesab.AllHesab = new ObservableCollection<Hesab>(ls2.ToList()); 
      hes.Add(hesab); 
     } 
     FirstHesab = hes; 
    } 

et XAML

 <TreeView ItemsSource="{Binding FirstHesab}"> 
     <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding AllHesab}" DataType="   {x:Type local:Hesabs}"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Name}" Tag="{Binding ID}"/> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

mais remplir 2 niveaux :(

Répondre

1

Vous vérifiez que des éléments avec FatherId == null et affecte leurs enfants - c'est pourquoi vous ne obtenir une hiérarchie de niveau dans l'arbre. Changement:

foreach (Hesab hh in ls.ToList()) 

à:

foreach (Hesab hh in crm.Hesab.ToList()) 
{ 
    // ... 
    // also assign father id, you'll need it to extract actual root elements 
    hesab.FatherId = hh.FatherId; 
} 

Pour obtenir des éléments de la racine, il suffit d'interroger hes.Where(h => h.FatherId == null) et assignons à FirstHesab.

Sur une note de côté, votre modèle de vue pourrait être mieux, au lieu de Hesabs classe vous pourriez avoir:

class HesabViewModel 
{ 
    HesabViewModel(Hesab hesab) 
    { 
     // set properties you'd like to expose to View, eg: 
     this.Name = hesab.Name; 
     this.Children = new ObservableCollection<HesabViewModel>(); 
    } 

    public string Name { get; set; } 
    public ObservableCollection<HesabViewModel> Children { get; private set; } 
} 

Fondamentalement, votre vision des classes de modèle devrait permettre un accès plus facile à modéliser des objets pour votre point de vue. L'héritage (comme vous le faites maintenant) n'est probablement pas le meilleur moyen - il ne sépare pas vraiment le modèle de la vue.

+0

merci beaucoup ... –

Questions connexes