从4个列表

时间:2016-05-25 23:24:51

标签: c# treeview

我使用的类的层次结构和关系可以这样显示:

diagram

我也有相应的.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”类型异常

     

附加信息:指定的参数超出范围   有效值。

1 个答案:

答案 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;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}