C# DataView在DataTable GroupBy之后未正确排序
我目前正在从SQL Server获取数据并存储在数据表中。我正在对该数据表应用GroupBy操作,以便在DataGrid中以各种形式显示该表。在生成子数据表之后,我通过将数据表放在DataView中对其进行排序。对DataView进行排序后,我将其绑定到DataGridView。但问题是GroupBy生成的行没有正确排序 我能找到解决办法吗 下面是DataView 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
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));