交叉表的简单实现2:使用前端程序实现
2007-05-24 03:27 晓风残月 阅读(2745) 评论(2) 编辑 收藏 举报
上篇介绍了 交叉表的简单实现1:使用存储过程,这里采取在前端程序实现。
实现要点:
1。读取所有目标成绩(flatScroreTable)
2。从目标成绩中提取考试时间(不重复),作为交叉表的列表头
3。从目标成绩中提取考试科目(不重复),作为交叉表的行表头
4。根据2动态构建一个DataTable(crossScroreTable),此DataTable具有一个科目列,若干考试时间列,以及其他信息。
5。将3中的考试科目写入DataTable
6。从flatScroreTable中读取成绩值填入crossScroreTable对应单元格
说明:便于理解,这里将交叉表crossScroreTable想象成一张Excel表,列名就当作列表头,科目名就当作行表头。
主要代码:
看下这个方法:
如果 ADO.NET 2.0 中我们就可以直接使用 DataView 的 ToTable 方法的重载版本:
SelectDistinct 网上有很多版本,原理基本一样,只是效率问题,这里是修改于 Erik Porter 的Select DISTINCT on DataTable。
SelectDistinct完整代码:
说明:由于朋友要求是在 1.1 环境下,所以只有自己写SelectDistinct,只有用DataGrid演示了^_^
源码:
下载
实现要点:
1。读取所有目标成绩(flatScroreTable)
2。从目标成绩中提取考试时间(不重复),作为交叉表的列表头
3。从目标成绩中提取考试科目(不重复),作为交叉表的行表头
4。根据2动态构建一个DataTable(crossScroreTable),此DataTable具有一个科目列,若干考试时间列,以及其他信息。
5。将3中的考试科目写入DataTable
6。从flatScroreTable中读取成绩值填入crossScroreTable对应单元格
说明:便于理解,这里将交叉表crossScroreTable想象成一张Excel表,列名就当作列表头,科目名就当作行表头。
主要代码:
void LoadScoreData()
{
读取指定学生的所有成绩 读取指定学生的所有成绩
DataTable flatScoreTable = ds.Tables[0];
DataView flatScoreView = new DataView(flatScoreTable);
// 读取科目列表,排除重复
DataTable subjectList;
// .NET 2 using the ToTable method supported by DataView
//subjectList = flatScoreView.ToTable("SubjectList", true, "SubjectName");
subjectList = SelectDistinct(flatScoreTable, "SubjectList", true, "SubjectName");
// 读取考试时间列表,排除重复
// .NET 2
DataTable examDateList;
// .NET 2 using the ToTable method supported by DataView
//examDateList = flatScoreView.ToTable("ExamDateList", true, "ExamDate");
examDateList = SelectDistinct(flatScoreTable, "ExamDateList", true, "ExamDate");
创建 交叉表 创建 交叉表
// 绑定,输出数据
grdCrossScore.DataSource = crossScoreTable;
grdCrossScore.DataBind();
grdFlatScore.DataSource = flatScoreTable;
grdFlatScore.DataBind();
grdSubjectList.DataSource = subjectList;
grdSubjectList.DataBind();
grdExamDate.DataSource = examDateList;
grdExamDate.DataBind();
}
{
读取指定学生的所有成绩 读取指定学生的所有成绩
DataTable flatScoreTable = ds.Tables[0];
DataView flatScoreView = new DataView(flatScoreTable);
// 读取科目列表,排除重复
DataTable subjectList;
// .NET 2 using the ToTable method supported by DataView
//subjectList = flatScoreView.ToTable("SubjectList", true, "SubjectName");
subjectList = SelectDistinct(flatScoreTable, "SubjectList", true, "SubjectName");
// 读取考试时间列表,排除重复
// .NET 2
DataTable examDateList;
// .NET 2 using the ToTable method supported by DataView
//examDateList = flatScoreView.ToTable("ExamDateList", true, "ExamDate");
examDateList = SelectDistinct(flatScoreTable, "ExamDateList", true, "ExamDate");
创建 交叉表 创建 交叉表
// 绑定,输出数据
grdCrossScore.DataSource = crossScoreTable;
grdCrossScore.DataBind();
grdFlatScore.DataSource = flatScoreTable;
grdFlatScore.DataBind();
grdSubjectList.DataSource = subjectList;
grdSubjectList.DataBind();
grdExamDate.DataSource = examDateList;
grdExamDate.DataBind();
}
看下这个方法:
DataTable SelectDistinct(DataTable sourceTable, string newTableName, bool distinct, params string[] columnNames)
扩展 ADO.NET 1.x 中DataTable 以及 DataView 均无法支持的:SELECT DISTINCT Column1,Column2.... 语法,(选择不重复的行)如果 ADO.NET 2.0 中我们就可以直接使用 DataView 的 ToTable 方法的重载版本:
public DataTable ToTable(bool distinct, params string[] columnNames);
public DataTable ToTable(string tableName, bool distinct, params string[] columnNames);
public DataTable ToTable(string tableName, bool distinct, params string[] columnNames);
SelectDistinct 网上有很多版本,原理基本一样,只是效率问题,这里是修改于 Erik Porter 的Select DISTINCT on DataTable。
SelectDistinct完整代码:
说明:由于朋友要求是在 1.1 环境下,所以只有自己写SelectDistinct,只有用DataGrid演示了^_^
源码:
下载