排序后将排名列添加到数据表

时间:2018-10-24 17:54:46

标签: c#

我正在尝试将新列添加到作为等级的数据表中。为此,我想在排序后遍历每一行,然后为从1开始的每一行分配一个等级。

下面是我的代码。但是,排名是在排序之前分配给行的。
因此,我的排名计算并未执行应做的事情。这样可以增加排名吗?

protected void bindGridView(GridView gv)
{
    using(DataTable dt = getData())
    {
        DataColumn dc_Total = new DataColumn("Total");
        DataColumn dc_Rank = new DataColumn("Rank");            
        dt.Columns.Add(dc_Total);
        dt.Columns.Add(dc_Rank);
        dc_Rank.SetOrdinal(1);
        dc_Total.SetOrdinal(2);
        foreach (DataRow dr in dt.Rows)
        {
            dr["Total"] = Convert.ToDouble(dr["A_B_PERC"].ToString()) + Convert.ToDouble(dr["C_PERC"].ToString());
        }
        dt.DefaultView.Sort = "Total";
        int rank = 1;
        foreach(DataRow dr in dt.Rows)
        {
            dr["Rank"] = rank;
            rank++;
        }
        gv.DataSource = dt;
        gv.DataBind();
    }
}

以下是我得到的结果: enter image description here

我真正想要的是: enter image description here

1 个答案:

答案 0 :(得分:0)

我可以使用以下代码解决问题:

protected void bindGridView(GridView gv)
{
    using(DataTable dt = getData())
    {
        DataColumn dc_Total = new DataColumn("Total");
        DataColumn dc_Rank = new DataColumn("Rank");            
        dt.Columns.Add(dc_Total);
        dt.Columns.Add(dc_Rank);
        dc_Rank.SetOrdinal(1);
        dc_Total.SetOrdinal(2);
        foreach (DataRow dr in dt.Rows)
        {
            dr["Total"] = Convert.ToDouble(dr["A_B_PERC"].ToString()) + Convert.ToDouble(dr["C_PERC"].ToString());
        }
        dt.DefaultView.Sort = "Total";
        using(DataView dv = dt.DefaultView)
        {
            int rank = 1;
            foreach (DataRowView drv in dv)
            {
                drv["Rank"] = rank;
                rank++;
            }
            gv.DataSource = dv;
            gv.DataBind();
        }
    }
}

希望这对其他有类似问题的人有所帮助。