【问题标题】:calculate rank from student marks stored in datatable in vb. net根据存储在 vb 数据表中的学生分数计算排名。网
【发布时间】:2015-10-03 10:14:51
【问题描述】:

我正在开发 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))

然后通过循环遍历数据表的行和列,计算所有科目的总和并添加到获得的分数列中。

        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

如何根据数据表列“获得的分数”中包含的总分计算学生的排名/位置。 IE。 成绩为 436 的学生 Rank 应为 1 成绩为 429.5 的学生排名应为 2 学生成绩412 Rank应该是3 ....

以此类推,直到记录中的所有行。 (附图)

如果数据表有任何功能可以在这里提供帮助,或者我如何在循环中添加逻辑来计算学生的排名并在排名列中添加值。谢谢

附:我不想根据获得的分数对行进行排序,但想在他/她的分数前面添加每个学生的排名,这已经按他们的卷号排序。

【问题讨论】:

  • 您可以在 DataView 上进行排序。我的意思是排序发生在不影响网格当前顺序的对象上。
  • 是的,我知道 datagridview 排序,我已经提到我想保留可见的行,因为这是必不可少的,因为学生在该课程中按“Roll No”的顺序显示。必须在排名列中填写他们的排名值。
  • 我不是在谈论对 DataGridView 进行排序。我认为您可以根据获得的标记从您的 DataTable 中构建一个名为 DataView 的新对象,然后将 Rank 的值设置为您的表,查看此 DataView 的顺序。
  • 哦,谢谢,我会试试这个并回复。

标签: vb.net datatable vb6 datagridviewcolumn


【解决方案1】:

您可以使用此代码在表格中设置排名列

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;
}

警告,我不在可以测试它的电脑上。

【讨论】:

  • 感谢@steve,这正是我想要的,你的真棒。非常感谢:)
  • 如果学生分数相同,是否有办法阻止排名增加。即如果两个学生得到 300 分,那么排名应该是相同的。
  • 为您的请求添加了可能的解决方案。
猜你喜欢
  • 2021-09-13
  • 2011-11-04
  • 1970-01-01
  • 2022-01-14
  • 2017-11-24
  • 2019-06-14
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多