C# DataView在DataTable GroupBy之后未正确排序

C# DataView在DataTable GroupBy之后未正确排序,c#,gridview,datatable,dataview,C#,Gridview,Datatable,Dataview,我目前正在从SQL Server获取数据并存储在数据表中。我正在对该数据表应用GroupBy操作,以便在DataGrid中以各种形式显示该表。在生成子数据表之后,我通过将数据表放在DataView中对其进行排序。对DataView进行排序后,我将其绑定到DataGridView。但问题是GroupBy生成的行没有正确排序 我能找到解决办法吗 下面是DataView GroupBy代码 DataView view = new DataView(dtfullreport); // Datatable

我目前正在从SQL Server获取数据并存储在数据表中。我正在对该数据表应用GroupBy操作,以便在DataGrid中以各种形式显示该表。在生成子数据表之后,我通过将数据表放在DataView中对其进行排序。对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);
            }
我是根据Order_Date列排序的,但在按降序排序DataView之后 但结果是,

分组前的数据表

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

按销售数量降序排序后

按销售数量升序排序后


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

答案很简单。如果未为已排序数据表中的列提供类型,则假定为string,结果排序为dictionary排序

如果将数字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");
致:

。。。它应该开始工作了


您可以阅读更多关于向数据表添加列的信息

答案非常简单。如果未为已排序数据表中的列提供类型,则假定为string,结果排序为dictionary排序

如果将数字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");
致:

。。。它应该开始工作了


您可以阅读有关向数据表添加列的更多信息

抱歉stackoverflow中的图像未显示抱歉stackoverflow中的图像未显示如果我这样做,日期时间将成为一个问题。应该有一个替代方法DateTime如何成为一个问题?因为我之前将DateTime转换为字符串,它说DateTime不能从字符串转换。如果我没有将datetime转换为字符串,则datetime显示的格式是错误的。我已经将您的答案作为正确答案,因为我从您那里得到了一个近似的解决方案,并为我的项目修改了它。谢谢-我没有注意到你正在将日期转换为字符串。我编写的用于重现此问题的测试应用程序没有做到这一点。我认为,如果可以避免将日期转换为字符串,就应该避免。一般来说,更强类型的ToString()-ed应该只用于显示目的,在显示它们之前的最后一秒。如果我这样做,日期时间就会成为一个问题。应该有一个替代方法DateTime如何成为一个问题?因为我之前将DateTime转换为字符串,它说DateTime不能从字符串转换。如果我没有将datetime转换为字符串,则datetime显示的格式是错误的。我已经将您的答案作为正确答案,因为我从您那里得到了一个近似的解决方案,并为我的项目修改了它。谢谢-我没有注意到你正在将日期转换为字符串。我编写的用于重现此问题的测试应用程序没有做到这一点。我认为,如果可以避免将日期转换为字符串,就应该避免。一般来说,更强的类型只应在显示前的最后一秒显示为显示目的。
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));