C# 用C语言显示分层数据#

C# 用C语言显示分层数据#,c#,.net,linq,hierarchy,C#,.net,Linq,Hierarchy,我正在尝试开发一个页面,按科目/老师显示学生/班级成绩 有些班级有包含学生的小组,有些班级只有学生。一个科目由一个或多个教师思考。这可能会在将来发生变化,我希望设计尽可能灵活(即,受试者可能被分为模块或单独的测试结果,班级可能会按年份进一步分组等) 我想在一个网格中显示最终结果,我可以展开和汇总以平均结果(Y上的类和X上的主题) 我的想法是有3个数据库表,如下所示: **class_structure** id (int) PK description (varchar) parent_id (

我正在尝试开发一个页面,按科目/老师显示学生/班级成绩

有些班级有包含学生的小组,有些班级只有学生。一个科目由一个或多个教师思考。这可能会在将来发生变化,我希望设计尽可能灵活(即,受试者可能被分为模块或单独的测试结果,班级可能会按年份进一步分组等)

我想在一个网格中显示最终结果,我可以展开和汇总以平均结果(Y上的类和X上的主题)

我的想法是有3个数据库表,如下所示:

**class_structure**
id (int) PK
description (varchar)
parent_id (int) FK to id
最高级别是班级(没有家长id),最低级别是学生

**subject_structure**
id (int) PK
description (varchar)
parent_id (int) FK to id
最高层次是学科,最低层次是教师

**results**
id (int) PK 
class_structure_id (int) FK
subject_structure_id (int) FK
date (datetime)
reult (int)
您认为上述结构如何?我相信这给了我前进的灵活性

在我的asp.net应用程序中,然后我查询最高的类结构级别,并平均出低于该级别的所有结果(我最好在数据库中的存储过程中进行此平均,还是在应用程序中使用say LINQ?)

这将在最高级别上返回一组结果

然后我需要针对主题类显示这是一个表(我正在考虑用C#?)来创建表html(即,首先创建所有标题,然后尝试将结果放置在正确的列中(但我不确定如何做))


主题1
主题2
教师1
老师2
教师1
老师2
第一类
学生1
90
55
75
100
学生2
40
95
65
39
然后,当用户单击第一个类时,这将展开并显示所有组(如果有,则显示学生,如果没有)(将单击单元格的类结构id传递给相同的方法/存储过程并获得这些结果),然后使用额外的列重新绘制表


这是实现我的目标的好方法吗?

我建议使用以下表格:

Person
 - Person_ID (PK)
 - Type (student/teacher etc)
 - Name etc...

PersonGroups
 - PersonGroup_ID (PK)
 - Description etc..

Subjects
 - Subject_ID (PK)
 - Description etc...

Classes
 - Class_ID (PK)
 - Subject_ID (FK)
 - Description etc...

PersonClassMembership
 - Person_ID (FK)
 - PersonGroup_ID (FK)
 - Class_ID (FK)

PersonGroupMembership
 - PersonGroup_ID (FK)
 - Person_ID (FK)
有了这一点,它就足够灵活地向班级/小组中添加更多的成员,如新教师或学生

这绝不是最好的方式,也不是“正确”的方式,它只是让你去思考 规范化数据库,以便更轻松地创建查询。

1:)分层数据不应显示在
中,请使用嵌套的
    。表格用于表格数据

    2:)由于c#是一种面向对象的语言,我不会通过Id引用树中的对象。为什么不添加一个子对象集合作为成员?示例代码模式如下:

    class TreeElement 
    {
     public TreeElement Parent {get;}
     public IEnumerable<TreeElement> Children{get;};
     public AddChild(TreeElement element }
     public bool IsRoot { return Parent == null; }
     public bool IsLeaf { return Children.Length == 0; }
     public bool IsBranch {return !IsRoot && !IsLeaf; }
    }
    
    类树元素
    {
    公共树元素父级{get;}
    公共IEnumerable子项{get;};
    公共AddChild(TreeElement元素}
    public bool IsRoot{return Parent==null;}
    public bool IsLeaf{return Children.Length==0;}
    公共bool IsBranch{return!IsRoot&&!IsLeaf;}
    }
    
    通常在树中,您不希望执行父级查找。因此,如果不需要,请保留所有父级引用以避免无用的复杂性;) 尝试在数据库中以类似上面的对象结构插入内容

    3:)在SQL中,根据您的模型进行的键查找最终会非常慢。您必须在查询中循环槽数据并使用if/else语句 在SQLTeam上,我们讨论了如何使用额外的沿袭列来快速实现这一点


    4:)使用linq查询并生成数据的结果。

    我不同意您的表设计。使用递归将混合数据放在一个表中真是个坏主意。除非需要在数据库中存储类似于树的数据,否则不要这样做。根据您的问题,更好的设计:

    • 餐桌上的学生
    • 桌上教师
    • 表类
    • 表主题类型(类型id、描述)英语、数学、体育等
    • 表科目(班级id、教师id、科目类型id)
    • 表学生分布(学生id、科目id)
    • 表格分数(学生id、受试者id、分数)

    如果你可以在你的应用程序中使用jQuery,那么考虑使用下面的jQuery插件,它有很多特性…


    正如JsTree网站所述,JsTree是绝对免费的(按照MIT许可证或GNU通用公共许可证(GPL)第2版的条款,许可与jQuery相同)。

    l也必须查看ul,我本以为尝试将标题与列表对齐会很困难?谢谢-我将研究上面Caspar Kleijne提出的想法,因为我觉得未来结构会发生变化,我希望未来证明/谢谢-我将研究Caspar Kleijne提出的想法,因为我觉得将来结构会有变化,我希望未来证明/结构和未来证明的变化通常不是将混合数据放入具有递归IMHO的单个表中的好理由。最终,它会很快陷入混乱,表现不佳。然而,如何实现它完全取决于您。我对这一点很陌生,但有可能在列表/树中有水平对齐的数据列表吗?或者您是否建议使用其他方式来表示数据?我建议使用JsTree这种免费定制插件的原因是,它已经实现了事件数据获取/发布等机制,您无需再次努力。在UI透视图中,如果希望以自定义树结构显示数据,那么最好使用
    • 列表,而不是&s'。对于每个
    • ,您需要连接事件,以便单击该
    • ,再次填充子节点等。如果您发现我的答案有用,请不要忘记标记为“答案/投票”。)我需要15个代表才能投票!我明白你的意思,但我需要
      class TreeElement 
      {
       public TreeElement Parent {get;}
       public IEnumerable<TreeElement> Children{get;};
       public AddChild(TreeElement element }
       public bool IsRoot { return Parent == null; }
       public bool IsLeaf { return Children.Length == 0; }
       public bool IsBranch {return !IsRoot && !IsLeaf; }
      }