我正在研究vb.net中的考试结果系统,该系统要求根据获得的分数计算学生等级。主题标记数据存储在数据库中。我正在数据表中加载主题标记
da.Fill(dt) 'added to a datagridview.
DataGridView1.DataSource = dt
然后在dt中添加新列以显示结果:
dt.Columns.Add("Obtained Marks", GetType(String))
dt.Columns.Add("Percent", GetType(String))
dt.Columns.Add("Result", GetType(String))
dt.Columns.Add("Rank", GetType(Integer))
然后计算所有受试者的总数&通过循环遍历行和&amp ;;添加到获得的标记列中数据表的列。
For s As Integer = 0 To dt.Rows.Count - 1
For t As Integer = 0 To dt.Columns.Count - 1
obtmarks += CDbl(dt.Rows(s).Item(t))
Next
dt.Rows(s)("Obtained Marks") = obtmarks
dt.Rows(s)("Result") = "PASS"
dt.Rows(s)("Rank") = 'RANK OF STUDENT
Next
如何根据数据表栏中包含的总分数来计算学生的等级/位置"获得的分数"。 即 有分数的学生436 Rank应为1 有分数429.5的学生等级应为2 有标记的学生412等级应为3 ....
等等,直到记录中的所有行。 (图片附加)
如果有数据表的任何功能可以在这里提供帮助,或者我如何在循环中添加逻辑来计算学生的等级并在等级列中添加值。谢谢
排序。答案 0 :(得分:1)
您可以使用此代码设置表格中的Rank列
DataView dv = new DataView(dt, "", "ObtainedMarks desc", DataViewRowState.CurrentRows);
for(int x = 0; x < dv.Count; x++)
dv[x].Row["Rank"] = x+1;
只有在您完成计算列ObtainedMarks
另外,我建议在设置DataGridView的DataSource之前执行all,以避免在你还没有完成它时重新绘制网格中不必要的延迟
修改强>
要为具有相同标记的人提供相同的等级,您可以尝试这样的事情
int lastMark = -1;
int currentRank = 0;
int atSameRank = 1;
DataView dv = new DataView(dt, "", "ObtainedMarks desc", DataViewRowState.CurrentRows);
for(int x = 0; x < dv.Count; x++)
{
int currentMark = Convert.ToInt32(dv["ObtainedMarks"]);
if(currentMark != lastMark)
{
lastMark = currentMark;
currentRank = currentRank + atSameRank;
atSameRank = 0;
}
else
atSameRank++;
dv[x].Row["Rank"] = currentRank;
}
警告,我不在PC上,我可以测试它。