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