上篇介绍了
交叉表的简单实现1:使用存储过程,这里采取在前端程序实现。
实现要点:
1。读取所有目标成绩(flatScroreTable)
2。从目标成绩中提取考试时间(不重复),作为交叉表的列表头
3。从目标成绩中提取考试科目(不重复),作为交叉表的行表头
4。根据2动态构建一个DataTable(crossScroreTable),此DataTable具有一个科目列,若干考试时间列,以及其他信息。
5。将3中的考试科目写入DataTable
6。从flatScroreTable中读取成绩值填入crossScroreTable对应单元格
说明:便于理解,这里将交叉表crossScroreTable想象成一张Excel表,列名就当作列表头,科目名就当作行表头。
主要代码:
实现要点:
1。读取所有目标成绩(flatScroreTable)
2。从目标成绩中提取考试时间(不重复),作为交叉表的列表头
3。从目标成绩中提取考试科目(不重复),作为交叉表的行表头
4。根据2动态构建一个DataTable(crossScroreTable),此DataTable具有一个科目列,若干考试时间列,以及其他信息。
5。将3中的考试科目写入DataTable
6。从flatScroreTable中读取成绩值填入crossScroreTable对应单元格
说明:便于理解,这里将交叉表crossScroreTable想象成一张Excel表,列名就当作列表头,科目名就当作行表头。
主要代码:
void
LoadScoreData()
{
读取指定学生的所有成绩#region 读取指定学生的所有成绩
string stuName = drpStu.SelectedValue;
string connStr = "SERVER=.;DATABASE=DemoLib;UID=sa";
string sql = "SELECT SubjectName, StudentName, ScoreValue, ExamDate FROM t_Score WHERE StudentName = @StuName";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sql, connStr);
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.Parameters.Add("@StuName", stuName);
da.Fill(ds, "FlatScore");
#endregion 读取指定学生的所有成绩
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");
创建 交叉表#region 创建 交叉表
DataTable crossScoreTable = new DataTable();
构造表模式#region 构造表模式
{
读取指定学生的所有成绩#region 读取指定学生的所有成绩
string stuName = drpStu.SelectedValue;
string connStr = "SERVER=.;DATABASE=DemoLib;UID=sa";
string sql = "SELECT SubjectName, StudentName, ScoreValue, ExamDate FROM t_Score WHERE StudentName = @StuName";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sql, connStr);
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.Parameters.Add("@StuName", stuName);
da.Fill(ds, "FlatScore");
#endregion 读取指定学生的所有成绩
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");
创建 交叉表#region 创建 交叉表
DataTable crossScoreTable = new DataTable();
构造表模式#region 构造表模式