/// <summary> /// 按班级总成绩排名 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click(object sender, EventArgs e) { this.dataGridView1.DataSource = null; if (this.cmbClass.SelectedValue == null || this.cmbSubjects.SelectedValue == null) { MessageBox.Show("你还没选中专业或学科"); return; } //创建某班级成绩表作为DataRowView的数据源 DataTable dt = new DataTable(); //为dt表创建数据列 DataColumn cnum = new DataColumn("学号", typeof(string)); //第一列显示学生学号 DataColumn cname = new DataColumn("姓名", typeof(string)); //第二列显示学生姓名 dt.Columns.Add(cnum); dt.Columns.Add(cname);//将此列添加到dt表中 //遍历学科下拉列表,将每个学科构造成表中的列,列名为学科名称 for (int i = 0; i < cmbSubjects.Items.Count; i++) { string subname = ((DataRowView)this.cmbSubjects.Items[i])["Subjects_Name"].ToString(); DataColumn cgrade = new DataColumn(subname, typeof(int)); cgrade.DefaultValue = 0;//默认值为0 dt.Columns.Add(cgrade); } DataColumn csum = new DataColumn("总分", typeof(int)); dt.Columns.Add(csum); //为dt表添加数据行 //2.1根据班级编号在学生表中选出该班级所有学生信息形成数据表stu StudentsModel stumodel = new StudentsModel(); stumodel.StudentClass = this.cmbClass.SelectedValue.ToString(); DataTable stu = student.GetStudentByClasses(stumodel);//查询选中班的所有学生,形成学生表 //2.2根据班级编号在成绩表中选出改版机所有学生所有科目的成绩形成数据表exam ClassesModel classmodel = new ClassesModel(); classmodel.Classes_ID = this.cmbClass.SelectedValue.ToString(); DataTable exam = examin.GetAllGradeByClass(classmodel); //遍历学生表中所有行,将每个学生构造成一个和自定义的dt表具有相同结构的数据行 for (int i = 0; i < stu.Rows.Count; i++) { DataRow row = dt.NewRow(); row["学号"] = stu.Rows[i]["StudentNum"]; //初始化一个和dt表具有相同结构的数据行 row["姓名"] = stu.Rows[i]["Student_Name"]; //从学生表第i行取出学号列,赋给dt表学号 //从结果集成绩表中再次查询第i个学生的所有成绩,返回数据行集合 DataRow[] rows = exam.Select("StudentID=" + stu.Rows[i]["Student_ID"]); int total = 0; //总分 string name; //科目的列名 int score = 0; for (int j = 0; j < rows.Length; j++) { //获取科目名称 name = ((DataRowView)this.cmbSubjects.Items[j])["Subjects_Name"].ToString(); score = Convert.ToInt32(rows[j]["ExamScore"]); //把第i个学生的第j个成绩取出 row[name] = score; //把成绩填充到第i行中的某科目中 total += score; //累加总分 } row["总分"] = total; dt.Rows.Add(row); //将构造好的行添加到行集合 } //3,创建数据表dt的视图view进行排序 DataView view = dt.DefaultView; if (this.checkBox1.Checked) //若按总分高低排序被勾选 { view.Sort = "总分 desc"; //则按总分列降序排列 } else { view.Sort = "总分 asc"; } this.dataGridView1.DataSource = dt; }