我有一个入门级:
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
任何帮助将不胜感激......
答案 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
。