在C#中显示分层数据

时间:2010-09-15 09:10:41

标签: c# .net linq hierarchy

我正在尝试开发一个页面来显示主题/老师的学生/班级成绩。

有些班级的小组包含学生,有些班级只有学生。一个主题由一个或多个教师思考。这可能会在未来发生变化,我希望尽可能保持设计的灵活性(即主题可以分解为模块或单独的测试结果,类可能按年份进一步分组等)

我希望在网格中显示最终结果,我可以展开并汇总以平均结果(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应用程序中,然后我查询最高级别的结构级别并平均下面的所有结果(我最好在数据库中的sproc中进行平均或在应用程序中使用说LINQ吗?)

这会给我一些最高级别的结果。

然后我需要显示这是一个表(我想在C#中创建表html?)对主题类(即首先创建所有头,然后尝试将结果放在正确的列中(我不知道怎么做但是))。

<table border="1" padding="2">
 <tr>
  <td></td>
  <td></td>
  <td colspan="2" align="center">Subj 1</td>
  <td colspan="2" align="center">Subj 2</td>
 </tr>

 <tr>
  <td></td>
  <td></td>
  <td>Teacher 1</td>
  <td>Teacher 2</td>
  <td>Teacher 1</td>
  <td>Teacher 2</td>
 </tr>
 <tr>
  <td rowspan="2">Class 1</td>
  <td>Student 1</td>
  <td>90</td>
  <td>55</td>
  <td>75</td>
  <td>100</td>
 </tr>
 <tr>
  <td>Student 2</td>
  <td>40</td>
  <td>95</td>
  <td>65</td>
  <td>39</td>
 </tr>
</table>

然后,当用户点击第一个类时,这将展开并显示所有组(如果有的话,如果没有,则显示学生)(将单击的单元格的class_structure_id传递给相同的方法/ sproc并获得这些结果)和然后用额外的列重绘表格。

这是实现我想要做的事情的好方法吗?

4 个答案:

答案 0 :(得分:3)

1:)不应在<table>中显示分层数据,而是使用嵌套<ul><ol>。表格用于表格数据。

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

通常在树中,您不想进行父查找。因此,如果不需要,请保留所有父引用,以避免无用的复杂性;) 尝试在上面的对象结构中插入数据库中的东西。

3:)根据您的模型进行的密钥查找最终会在SQL中变得非常慢。您将不得不循环使用数据并在查询中使用if / else语句 在SQLTeam上a great sample关于如何使用额外的谱系列来快速实现这一点。

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

答案 1 :(得分:1)

如果您可以在应用程序中使用Jquery,那么请考虑使用以下Jquery插件,它具有很多功能..

http://www.jstree.com/

JsTree是完全免费的(根据MIT许可证或GNU通用公共许可证(GPL)版本2的条款,与jQuery一样许可) - 如jstree网站所述。

答案 2 :(得分:0)

我建议使用下表:

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)

有了它,它足够灵活,可以为一个班级/小组增加更多会员资格,例如新老师或学生。

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

答案 3 :(得分:0)

我不同意你的桌面设计。使用递归将混合数据放在一个表中确实是一个坏主意。除非您需要在DB中存储树状数据,否则不要这样做。根据你的问题,更好的设计:

  • 表学生
  • 表教师
  • table Classes
  • 表主题类型(type_id,description)英语,数学,体育等......
  • 表主题(class_id,teacher_id,subject_type_id)
  • table StudentDistribution(stu_id,subject_id)
  • 表得分(stu_id,subject_id,得分)