2016-04-10 4 views
0

У меня проблемы с сортировкой на моем Gridview. Кажется, что он находится в одном порядке сортировки, то есть по возрастанию? Никогда не переключается на Desc?ASP.NET Gridview Сортировка не сортировка

Я пропустил процесс отладки и не могу понять, где происходит ошибка?

Вот мой код, также использую разбивку на страницы, поэтому я не уверен, что это мешает ему работать правильно?

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    {   
    PopulateProductClass(); 
    PopulateProduct(); 
    } 
    PopulateOrderList(); 
} 

private string ConvertSortDirectionToSql(SortDirection sortDirection) 
{ 
    string newSortDirection = String.Empty; 

    switch (sortDirection) 
    { 
    case SortDirection.Ascending: 
     newSortDirection = "ASC"; 
     break; 

    case SortDirection.Descending: 
     newSortDirection = "DESC"; 
     break; 
    } 
    return newSortDirection; 
} 

protected void gvOrderItems_Sorting(object sender, GridViewSortEventArgs e) 
{ 

    DataTable dt = new DataTable(); 
    dt.Columns.Add("OrderDate", typeof(string)); 
    dt.Columns.Add("OrderNumber", typeof(string)); 
    dt.Columns.Add("OrderItemSKUName", typeof(string)); 
    dt.Columns.Add("SKUNumber", typeof(string)); 
    dt.Columns.Add("OrderItemStatus", typeof(string)); 
    dt.Columns.Add("OrderItemUnitCount", typeof(string)); 
    dt.Columns.Add("mtrx_Code2", typeof(string)); 

    for (int i = 0; i < gvOrderItems.Rows.Count; i++) 
    { 
    DataRow drNew = dt.NewRow(); 
    drNew["OrderDate"] = gvOrderItems.Rows[i].Cells[0].Text; 
    drNew["OrderNumber"] = gvOrderItems.Rows[i].Cells[1].Text.Replace("&nbsp;", ""); 
    drNew["OrderItemSKUName"] = gvOrderItems.Rows[i].Cells[3].Text; 
    drNew["SKUNumber"] = gvOrderItems.Rows[i].Cells[2].Text; 
    drNew["OrderItemStatus"] = gvOrderItems.Rows[i].Cells[6].Text; 
    drNew["OrderItemUnitCount"] = gvOrderItems.Rows[i].Cells[5].Text; 
    drNew["mtrx_Code2"] = gvOrderItems.Rows[i].Cells[4].Text; 
    dt.Rows.Add(drNew); 
    } 

    if (dt != null) 
    { 
    DataView dataView = new DataView(dt); 
    dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 

    gvOrderItems.DataSource = dataView; 
    gvOrderItems.DataBind(); 
    } 
} 

dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); e.SortDirection всегда показывает, как по возрастанию?

<asp:GridView ID="gvOrderItems" runat="server" GridLines="None" CellSpacing="-1" AutoGenerateColumns="false" 
    AllowSorting="true" OnSorting="gvOrderItems_Sorting"> 
    <Columns>        
    <asp:BoundField DataField="OrderDate" HeaderText="Date" SortExpression="OrderDate" /> 
    <asp:BoundField DataField="OrderNumber" HeaderText="Order Number" SortExpression="OrderNumber" /> 
    <asp:BoundField DataField="SKUNumber" HeaderText="Product Number" SortExpression="OrderNumber" /> 
    <asp:BoundField DataField="OrderItemSKUName" HeaderText="Product Description" /> 
    <asp:BoundField DataField="mtrx_Code2" HeaderText="Size" /> 
    <asp:BoundField DataField="OrderItemUnitCount" HeaderText="OTY" /> 
    <asp:BoundField DataField="OrderItemStatus" HeaderText="Status" />   
    </Columns> 
</asp:GridView> 

UPDATE

OK после того, как некоторые советы от Kostrzak Я посмотрел С.О. вопрос GridView sorting: SortDirection always Ascending и изменил мой Сортировка событие это ......

protected void gvOrderItems_Sorting(object sender, GridViewSortEventArgs e) 
{ 

    DataTable dt = new DataTable(); 
    dt.Columns.Add("OrderDate", typeof(string)); 
    dt.Columns.Add("OrderNumber", typeof(string)); 
    dt.Columns.Add("OrderItemSKUName", typeof(string)); 
    dt.Columns.Add("SKUNumber", typeof(string)); 
    dt.Columns.Add("OrderItemStatus", typeof(string)); 
    dt.Columns.Add("OrderItemUnitCount", typeof(string)); 
    dt.Columns.Add("mtrx_Code2", typeof(string)); 

    for (int i = 0; i < gvOrderItems.Rows.Count; i++) 
    { 
    DataRow drNew = dt.NewRow(); 
    drNew["OrderDate"] = gvOrderItems.Rows[i].Cells[0].Text; 
    drNew["OrderNumber"] = gvOrderItems.Rows[i].Cells[1].Text.Replace("&nbsp;", ""); 
    drNew["OrderItemSKUName"] = gvOrderItems.Rows[i].Cells[3].Text; 
    drNew["SKUNumber"] = gvOrderItems.Rows[i].Cells[2].Text; 
    drNew["OrderItemStatus"] = gvOrderItems.Rows[i].Cells[6].Text; 
    drNew["OrderItemUnitCount"] = gvOrderItems.Rows[i].Cells[5].Text; 
    drNew["mtrx_Code2"] = gvOrderItems.Rows[i].Cells[4].Text; 
    dt.Rows.Add(drNew); 
    } 

    if (dt != null) 
    { 
    if (e.SortExpression == (string)ViewState["SortColumn"]) 
    { 
     // We are resorting the same column, so flip the sort direction 
     e.SortDirection = 
      ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ? 
      SortDirection.Descending : SortDirection.Ascending; 
    } 
    // Apply the sort 
    dt.DefaultView.Sort = e.SortExpression + 
     (string)((e.SortDirection == SortDirection.Ascending) ? " ASC" : " DESC"); 
    ViewState["SortColumn"] = e.SortExpression; 
    ViewState["SortColumnDirection"] = e.SortDirection; 

    gvOrderItems.DataSource = dt; 
    gvOrderItems.DataBind(); 
    } 
} 

На Page Load в Порядок даты указан в порядке убывания.

2016-03-08
2016-02-10
2016-01-22
2016-01-22
2016-01-22
2016-01-22
2016-01- 22
2016-01-22
2015-11-11
2015-11-11

После нажатия на колонке Дата в gridvie ж он должен идти в порядке возрастания следующим образом:

2015-11-11
2015-11-11
2016-01-22
2016-01-22
2016-01-22
2016 -01-22
2016-01-22
2016-01-22
2016-02-10
2016-03-08

Ho Веверу отображается в следующем порядке

2016-03-08
2016-02-10
11/11/2015
11/11/2015
22/01/2016
22/01/2016
22/01/2016
22/01/2016
22/01/2016
22/01/2016

I A m не совсем уверен, как это добирается до этого заказа?

+2

Был уже аналогичный вопрос на SO: HTTP://stackoverflow.com/questions/250037/gridview-sorting-sortdirection-always-ascending – Kostrzak

+0

Спасибо, Костжак. Я уточнил вопрос. – Kevin

+1

Вам нужно пополнить DataTable из GridView в обработчике событий сортировки? Вызов 'PopulateOrderList' не мог бы сделать то же самое? Еще один момент: сортировка будет более предсказуемой, если дата была в поле Date вместо строки. Возможно, вызов этой проблемы также вызовет 'PopulateOrderList'. – ConnorsFan

ответ

0

Обнаружена проблема.Поскольку ConnorsFan указал на это, поле OrderDate устанавливалось как String вместо поля DateTime. Поэтому я изменил поле тип данных от typeof(string) к typeof(datetime), когда я создал DataTable, и это решило проблему

Перед

DataTable dt = new DataTable(); 
dt.Columns.Add("OrderDate", typeof(string)); 
dt.Columns.Add("OrderNumber", typeof(string)); 
dt.Columns.Add("OrderItemSKUName", typeof(string)); 
dt.Columns.Add("SKUNumber", typeof(string)); 
dt.Columns.Add("OrderItemStatus", typeof(string)); 
dt.Columns.Add("OrderItemUnitCount", typeof(string)); 
dt.Columns.Add("mtrx_Code2", typeof(string)); 

После

DataTable dt = new DataTable(); 
dt.Columns.Add("OrderDate", typeof(DateTime)); 
dt.Columns.Add("OrderNumber", typeof(string)); 
dt.Columns.Add("OrderItemSKUName", typeof(string)); 
dt.Columns.Add("SKUNumber", typeof(string)); 
dt.Columns.Add("OrderItemStatus", typeof(string)); 
dt.Columns.Add("OrderItemUnitCount", typeof(string)); 
dt.Columns.Add("mtrx_Code2", typeof(string)); 
Смежные вопросы