2016-04-10 13 views
0

Ich habe Probleme mit der Sortierung auf meinem Gridview. Es scheint immer in einer Sortierreihenfolge zu sein, d.h. aufsteigend? Geht nie zu Desc?ASP.NET Gridview Sortieren nicht sortieren

Ich habe den Debug-Prozess durchlaufen und kann nicht herausfinden, wo ich falsch liege?

Hier ist mein Code, verwende ich auch Paginierung, also bin ich nicht sicher, ob es verhindert, dass es richtig funktioniert?

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 zeigt immer als aufsteigende?

<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 nach ein paar Ratschläge von Kostrzak ich das SO GridView sorting: SortDirection always Ascending Frage nachgeschlagen und modifizierte meine Sortierung Event zu diesem ......

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

Auf Page Load der Die Datumsreihenfolge ist in der absteigenden Reihenfolge.

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

Nachdem er in der gridvie auf dem Datum der Spalte klicken w es aufsteigende Reihenfolge gehen Sie wie folgt vor:

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 wever wird

2016-03-08
2016-02-10
11/11/2015
11/11/2015
22/01/2016
22/01 in der folgenden Reihenfolge angezeigt/2016
22/01/2016
22/01/2016
22/01/2016
22/01/2016

I a Bin mir nicht wirklich sicher wie es zu dieser Bestellung kommt ??

+2

Es gab bereits ähnliche Frage auf SO: http://stackoverflow.com/questions/250037/gridview-sorting-sortdirection-always-ascending – Kostrzak

+0

Danke, Kostrzak Ich habe die Frage aktualisiert. – Kevin

+1

Müssen Sie die DataTable von der GridView in Ihrem Sortier-Event-Handler auffüllen? Rufen Sie 'PopulateOrderList' nicht auf? Ein weiterer Punkt: Die Sortierung wäre vorhersehbarer, wenn das Datum in einem Datumsfeld statt in einer Zeichenfolge enthalten wäre. Vielleicht würde das Aufrufen von 'PopulateOrderList' dieses Problem ebenfalls lösen. – ConnorsFan

Antwort

0

Das Problem gefunden.Als ConnorsFan darauf hinwies, wurde das OrderDate-Feld als ein String anstelle eines DateTime-Felds festgelegt. Also änderte ich das Feld Datentyp typeof(string)-typeof(datetime), wenn ich die Datentabelle erstellt und diese löste die Ausgabe

Vor

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

Nach

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