DataView在DataTable GroupBy之后没有正确排序

时间:2012-08-10 06:07:19

标签: c# gridview datatable dataview

我目前从SQL Server获取数据并存储在DataTable中。我在该DataTable上应用GroupBy操作,以便在DataGrid中以各种形式显示表。在进入子DataTables之后,我通过放入DataView来对DataTable进行排序。排序DataView后,我将它绑定到DataGridView。但问题是由GroupBy制作的行没有正确排序

我可以为此获得解决方案吗?

这是DataView GroupBy代码。

DataView view = new DataView(dtfullreport); // Datatable to dataview.
            var drdatedisp = from row in dtfullreport.AsEnumerable()
                             group row by row.Field<string>("Order_Date") into g
                             select new
                             {
                                 Order_Date = g.Key,
                                 totalQnty = g.Sum(a => a.Field<int>("Item_Quantity")),
                                 totalTax = g.Sum(a => float.Parse(a.Field<decimal>("TAXAMT").ToString())),
                                 totalAmt = g.Sum(a => float.Parse(a.Field<decimal>("VALAMT").ToString()))
                             };
            DataTable dtdatedisp = new DataTable();
            dtdatedisp.Columns.Add("Order_Date");
            dtdatedisp.Columns.Add("Item_Quantity");
            dtdatedisp.Columns.Add("TAXAMT");
            dtdatedisp.Columns.Add("VALAMT");
            dtdatedisp.Rows.Clear();
            foreach (var g in drdatedisp)
            {
                DataRow newRow1 = dtdatedisp.NewRow();
                newRow1[0] = g.Order_Date;
                newRow1[1] = g.totalQnty;
                newRow1[2] = String.Format("{0:0.00}", g.totalTax);
                newRow1[3] = String.Format("{0:0.00}", g.totalAmt);
                dtdatedisp.Rows.Add(newRow1);
            }

在对DataView进行分组并放入DataTable之后,我正在对DataTable进行排序

这是排序代码。 这将在GridView排序事件中编写。

string sortingDirection = string.Empty;
    if (dir == SortDirection.Ascending)
    {
        dir = SortDirection.Descending;
        sortingDirection = "Desc";
    }
    else
    {
        dir = SortDirection.Ascending;
        sortingDirection = "Asc";
    }
            DataView sortedView = new DataView((DataTable)ViewState["dtdatedisp"]);
        sortedView.Sort = e.SortExpression + " " + sortingDirection;
        gv_reports_date.DataSource = sortedView; // Gridview datasource and binding
        gv_reports_date.DataBind();

我正在基于Order_Date列进行排序,但是在按降序排序DataView之后 但输出是,

分组前的数据表

enter image description here

排序前的默认视图。 (根据数据库中的日期排序)。

enter image description here

按数量已售出的降序排序。

enter image description here

按数量已售出的升序排序。

enter image description here

分组的行未按正确的排序顺序显示

1 个答案:

答案 0 :(得分:4)

答案很简单。如果不为已排序的DataTable中的列提供类型,则假定为字符串,并且生成的排序是字典排序。

如果排序为整数,则数字10,6,30将按{6,10,30}排序,但是 {10,30,6}如果按字符串排序。

变化:

DataTable dtdatedisp = new DataTable();
dtdatedisp.Columns.Add("Order_Date");
dtdatedisp.Columns.Add("Item_Quantity");
dtdatedisp.Columns.Add("TAXAMT");
dtdatedisp.Columns.Add("VALAMT");

为:

DataTable dtdatedisp = new DataTable();
dtdatedisp.Columns.Add("Order_Date", typeof(DateTime));
dtdatedisp.Columns.Add("Item_Quantity", typeof(int));
dtdatedisp.Columns.Add("TAXAMT", typeof(decimal));
dtdatedisp.Columns.Add("VALAMT", typeof(decimal));

......它应该开始工作了。

Here您可以阅读有关向DataTable添加列的更多信息