Vb.net 从vb中存储在数据表中的学生分数计算排名。网
我正在vb.net中开发考试成绩系统,该系统要求根据获得的分数计算学生等级。主题标记数据存储在数据库中。我正在数据表中加载主题标记Vb.net 从vb中存储在数据表中的学生分数计算排名。网,vb.net,datatable,vb6,datagridviewcolumn,Vb.net,Datatable,Vb6,Datagridviewcolumn,我正在vb.net中开发考试成绩系统,该系统要求根据获得的分数计算学生等级。主题标记数据存储在数据库中。我正在数据表中加载主题标记 da.Fill(dt) 'added to a datagridview. DataGridView1.DataSource = dt 然后在dt中添加新列以显示结果: dt.Columns.Add("Obtained Marks", GetType(String)) dt.Columns.Add("Perce
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))
然后通过循环遍历datatable的行和列,计算所有主题的总数并添加到“获得的分数”列中
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分的学生应为1
成绩为429.5的学生应为2
成绩为412分的学生应该是3
依此类推,直到记录中的所有行。(附图)
如果datatable有任何函数可以在这里提供帮助,或者我如何在循环中添加逻辑来计算学生的排名,并在排名列中添加值。谢谢
p.S.我不想对获得的分数的行进行排序,但想在每个学生的分数前面添加排名,这已经按照他们的卷号排序。您可以使用此代码在表中设置排名列
DataView dv = new DataView(dt, "", "ObtainedMarks desc", DataViewRowState.CurrentRows);
for(int x = 0; x < dv.Count; x++)
dv[x].Row["Rank"] = x+1;
警告,我没有在PC上测试它。您可以在DataView上排序。我的意思是排序发生在一个不影响网格当前顺序的对象上。是的,我知道datagridview排序,已经提到我希望保持可见行的原样,这是很重要的,因为学生在该课程中是按“滚动编号”的顺序显示的。必须在rank列中填写它们的秩值。我不是说对DataGridView进行排序。我想你可以根据获得的分数从你的数据表中构建一个名为DataView的新对象,然后根据这个数据视图的顺序将Rank的值设置到你的表中。哦,谢谢,我会尝试一下并回答。谢谢@steve,这正是我想要的,你的数据太棒了。非常感谢:)如果学生分数相同,有没有办法阻止排名的增加。i、 如果两个学生得了300分,那么排名应该是相同的。为您的请求添加了一个可能的解决方案。
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;
}