如何在N Level

时间:2015-12-24 07:30:46

标签: c# wpf treeview

我有一个入门级:

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

和一个小组类:

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

      }

及其加载数据类

      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

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

1 个答案:

答案 0 :(得分:0)

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

给出以下输入:

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