1

現在、SQL Server からデータを取得し、DataTable に格納しています。DataGrid にさまざまな形式でテーブルを表示するために、その DataTable に GroupBy 操作を適用しています。サブ 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 Sorting Event に記述されます。

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 を降順で並べ替えた後、出力は次のようになります。

グループ化前のデータテーブル

ここに画像の説明を入力

並べ替え前のデフォルト ビュー。(データベースの日付に従ってソートされます)。

ここに画像の説明を入力

販売数量の降順にソート後。

ここに画像の説明を入力

販売数量の昇順でソートした後。

ここに画像の説明を入力

グループ化された行が正しいソート順で表示されない

4

1 に答える 1

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

...そして、動作を開始するはずです。

ここでは、DataTable への列の追加について詳しく読むことができます

于 2012-08-14T02:04:45.767 に答える