我使用的类的层次结构和关系可以这样显示:
我也有相应的.cs类用上面提到的关系编写。
现在,我有以下列表:
List<Main_Subjects> msl = si.get_main_subjects().ToList();
List<Subject> sl = si.get_subjects().ToList();
List<Mini_subjects> mnsl = si.get_mini_subjects().ToList();
List<Text> tl = si.get_texts().ToList();
忽略si.get ...语句。这些只是用Web服务中的数据填充列表。这些列表中填充了数据。
每个“Main_Subject”都有许多“主题”。 每个“主题”都有许多“Mini_Subject”。 每个“Mini_Subject”都有许多“文本”。
类的所有属性都设置为public,因此您可以通过.property
我的目标是创建一个TreeView来查看我上面描述的层次结构,所以它看起来像这样:
main_subject.name
subject.name
mini_subject.name
text.name
text.name
subject.name
mini_subject.name
text.name
main_subject.name
subject.name
mini_subject.name
text.name
text.name
subject.name
mini_subject.name
text.name
text.name
同样重要的是不仅要存储TreeView中的名称,还要存储与所查看名称对应的对象。
层次结构设置如下:
1)Main_Subject
2)Subject
3)Mini_Subject
4)Text
我试过创建嵌套的foreach
循环,但没有得到任何结果。
有什么建议吗?
修改
这是我到目前为止所遇到的问题: (igrone是localhost。语句。这些是因为Web服务而存在的。)
public void fill_tree()
{
int cnt = 0;
foreach (localhost.Main_Subjects a in msl)
{
treeView1.Nodes.Add(a.name);
treeView1.Nodes[cnt].Tag = a;
foreach (localhost.Subject b in sl)
{
if (b.main_subject_id == a.main_subject_id)
{
treeView1.Nodes[cnt].Nodes.Add(b.name);
treeView1.Nodes[cnt].Nodes[cnt].Tag = b;
foreach (localhost.Mini_subjects c in mnsl)
{
if (c.subject_id == b.subjects_id)
{
treeView1.Nodes[cnt].Nodes[cnt].Nodes.Add(c.name);
treeView1.Nodes[cnt].Nodes[cnt].Nodes[cnt].Tag = c;
foreach (localhost.Text d in tl)
{
if (d.mini_subjects_id == c.mini_subjects_id)
{
treeView1.Nodes[cnt].Nodes[cnt].Nodes[cnt].Nodes.Add(d.name);
treeView1.Nodes[cnt].Nodes[cnt].Nodes[cnt].Nodes[cnt].Tag = d;
}
}
}
}
}
}
cnt++;
}
}
错误:
System.Windows.Forms.dll中出现未处理的“System.ArgumentOutOfRangeException”类型异常
附加信息:指定的参数超出范围 有效值。
答案 0 :(得分:0)
问题是您使用单个变量cnt
来存储不同级别的多个索引,而您需要为eahc级别维护单独的索引。此外,这里使用索引是次优的并且可能是不合需要的。请尝试以下操作,它在每个级别存储对当前节点的引用,而不是依赖索引。
public void fill_tree()
{
foreach (localhost.Main_Subjects a in msl)
{
var node0 = treeView1.Nodes.Add(a.name);
node0.Tag = a;
foreach (localhost.Subject b in sl)
{
if (b.main_subject_id == a.main_subject_id)
{
var node1 = node0.Nodes.Add(b.name);
node1.Tag = b;
foreach (localhost.Mini_subjects c in mnsl)
{
if (c.subject_id == b.subjects_id)
{
var node2 = node1.Nodes.Add(c.name);
node2.Tag = c;
foreach (localhost.Text d in tl)
{
if (d.mini_subjects_id == c.mini_subjects_id)
{
var node3 = node2.Nodes.Add(d.name);
node3.Tag = d;
}
}
}
}
}
}
}
}
}
}