DataView не сортируется должным образом после DataTable GroupBy

В настоящее время я получаю данные с SQL Server и сохраняю их в DataTable. Я применяю операцию GroupBy к этому DataTable, чтобы отображать таблицу в различных формах в 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);
            }

После группировки 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 в порядке убывания, но на выходе получается,

Дата до группировки

введите описание изображения здесь

Просмотр по умолчанию перед сортировкой. (Отсортировано по дате в базе данных).

введите описание изображения здесь

После сортировки в порядке убывания проданного количества.

введите описание изображения здесь

После сортировки в порядке возрастания проданного количества.

введите описание изображения здесь

Сгруппированные строки отображаются в неправильном порядке сортировки.


person Krishna Thota    schedule 10.08.2012    source источник
comment
Извините, изображения в stackoverflow не отображаются   -  person Krishna Thota    schedule 10.08.2012


Ответы (1)


Ответ очень простой. Если вы не предоставляете типы для столбцов в отсортированном 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");

to:

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.

person Jakub Kaleta    schedule 14.08.2012
comment
Если я делаю это, дата и время становятся проблемой. должна быть альтернатива этому - person Krishna Thota; 14.08.2012
comment
DateTime становится проблемой, как? - person Jakub Kaleta; 14.08.2012
comment
поскольку я раньше конвертирую datetime в строку, он говорит, что datetime не может быть преобразован из строки. если я не преобразовал дату и время в строку, дата и время отображается в неправильном формате - person Krishna Thota; 14.08.2012
comment
Я дал ваш правильный ответ, так как я получил от вас близкое решение и модифицировал его для своего проекта. Спасибо - person Krishna Thota; 14.08.2012
comment
Понятно - я не заметил, что вы преобразовываете дату в строку. Тестовое приложение, которое я написал для воспроизведения этой проблемы, не помогло. Я бы сказал, что если вы можете избежать преобразования дат в строки, вам следует этого избегать. Обычно более сильные типы должны редактироваться ToString () только для целей отображения, в последнюю секунду перед их отображением. - person Jakub Kaleta; 14.08.2012