如何从 N 级数据库填充分层树视图

How fill the Hierarchical treeView from DataBase in N Level

我有一个条目 Class:

   public class Entry
   {
      public int Key { get; set; }
      public string Name { get; set; }
   }

和一组 Class:

   public class Group
   {
      public int Key { get; set; }
      public string Name { get; set; }

      public List<Group> SubGroups { get; set; }
      public List<Entry> Entries { get; set; }
      public List<object> Items
      {
         get
         {
            List<object> childNodes = new List<object>();
            foreach (var group in this.SubGroups)
               childNodes.Add(group);
            foreach (var entry in this.Entries)
               childNodes.Add(entry);

            return childNodes;
         }
      }
   }

我可以像这样手动向 treeView 添加数据:

public class TestData
   {

      public List<Group> Groups = new List<Group>();

      public void Load()
      {


         Group grp1 = new Group() { Key = 1, Name = "Group 1", SubGroups = new List<Group>(), Entries = new List<Entry>() };
         Group grp2 = new Group() { Key = 2, Name = "Group 2", SubGroups = new List<Group>(), Entries = new List<Entry>() };
         Group grp3 = new Group() { Key = 3, Name = "Group 3", SubGroups = new List<Group>(), Entries = new List<Entry>() };
         Group grp4 = new Group() { Key = 4, Name = "Group 4", SubGroups = new List<Group>(), Entries = new List<Entry>() };

         //grp1
         grp1.Entries.Add(new Entry() { Key = 1, Name = "Entry number 1" });
         grp1.Entries.Add(new Entry() { Key = 2, Name = "Entry number 2" });
         grp1.Entries.Add(new Entry() { Key = 3, Name = "Entry number 3" });

         //grp2
         grp2.Entries.Add(new Entry() { Key = 4, Name = "Entry number 4" });
         grp2.Entries.Add(new Entry() { Key = 5, Name = "Entry number 5" });
         grp2.Entries.Add(new Entry() { Key = 6, Name = "Entry number 6" });

         //grp3
         grp3.Entries.Add(new Entry() { Key = 7, Name = "Entry number 7" });
         grp3.Entries.Add(new Entry() { Key = 8, Name = "Entry number 8" });
         grp3.Entries.Add(new Entry() { Key = 9, Name = "Entry number 9" });

         //grp4
         grp4.Entries.Add(new Entry() { Key = 10, Name = "Entry number 10" });
         grp4.Entries.Add(new Entry() { Key = 11, Name = "Entry number 11" });
         grp4.Entries.Add(new Entry() { Key = 12, Name = "Entry number 12" });

         Groups.Add(grp1);
         Groups.Add(grp2);
         Groups.Add(grp3);
         Groups.Add(grp4);

         grp1.SubGroups.Add(grp2);
         grp2.SubGroups.Add(grp3);

      }

及其加载数据 Class

      private void LoadView()
      {
         TestData data = new TestData();
         data.Load();
         GroupView.ItemsSource = data.Groups;
      }

但是,我想像这样从数据库中填充 treeView:

ID    groupFlag     fatherID       Name
1        1            Null        Group1
2        1             1          Group1.1
3        0             2          Entry1
4        0             2          Entry2
5        1            Null        Group2
6        0             5          Entry3

任何帮助将不胜感激...

根据我从问题中了解到的情况,您将条目和组混合在一个 table 中,其中还包括嵌套组,以便将该数据放入您需要的格式(类你在问题中提到)我写了以下代码,它使用临时字典并分两步完成:

给定以下输入:

public class FlatItem {
    public int ID;
    public int groupFlag;
    public int? fatherID;
    public string Name;
}

var data = new List<FlatItem>();

data.Add(new FlatItem() { ID = 1, groupFlag = 1, fatherID = null, Name = "Group 1" });
data.Add(new FlatItem() { ID = 2, groupFlag = 1, fatherID = 1, Name = "Group 1.1" });
data.Add(new FlatItem() { ID = 3, groupFlag = 0, fatherID = 2, Name = "Entry 1" });
data.Add(new FlatItem() { ID = 4, groupFlag = 0, fatherID = 2, Name = "Entry 2" });
data.Add(new FlatItem() { ID = 5, groupFlag = 1, fatherID = null, Name = "Group 2" });
data.Add(new FlatItem() { ID = 6, groupFlag = 0, fatherID = 5, Name = "Entry 3" });

转换它:

//temporary dictionary used only while converting
var Groups = new Dictionary<int,Group>();
//final variable where the result will be in
var hierarchy = new List<Group>();

//creating groups
foreach (var item in data.Where(x=> x.groupFlag==1)) {
    var grp = new Group() {
        Key = item.ID,
        Name = item.Name,
        Entries = new List<Entry>(),
        SubGroups = new List<Group>()
    };
    //store reference for later use
    Groups[item.ID] = grp;

    if (item.fatherID == null) {
        //store it in main list
        hierarchy.Add(grp);
    } else {
        //store it in its parent
        Groups[(int)item.fatherID].SubGroups.Add(grp);
    }
}

//fill entries
foreach(var item in data.Where(x=> x.groupFlag == 0)) {
    Groups[(int)item.fatherID].Entries.Add(new Entry() {
        Key = item.ID,
        Name = item.Name
    });
}

现在变量 hierarchy 应该包含您想要的内容,您可以对不再需要的内容进行垃圾回收 Groups