2016-04-10 113 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一些意見,我擡頭一看SO質疑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年3月8日
2016年2月10日
2016年1月22日
2016年1月22日
2016年1月22日
2016年1月22日
2016-01- 22
2016年1月22日
2015年11月11日
2015年11月11日

點擊日期列在gridvie後w ^它應該去升序如下:

2015年11月11日
2015年11月11日
2016年1月22日
2016年1月22日
2016年1月22日
2016 -01-22
2016年1月22日
2016年1月22日
2016年2月10日
2016年3月8日

何wever它顯示在下面的順序

2016年3月8日
2016年2月10日
2015年11月11日
2015年11月11日
22/01/2016
22/01/2016
22/01/2016
22/01/2016
22/01/2016
22/01/2016

我一個米真不知道它是如何得到這個訂單?

+2

後有對SO已經類似的問題:HTTP:/ /stackoverflow.com/questions/250037/gridview-sorting-sortdirection-always-ascending – Kostrzak

+0

謝謝,Kostrzak我已經更新了這個問題。 – Kevin

+1

您是否需要在Sorting事件處理程序中從GridView中填充DataTable?調用'PopulateOrderList'不會做同樣的事情嗎?另一點:如果日期位於日期字段而不是字符串,排序將更具可預測性。也許調用'PopulateOrderList'也可以解決這個問題。 – ConnorsFan

回答

0

發現問題。正如ConnorsFan指出的那樣,OrderDate字段被設置爲字符串而不是DateTime字段。所以我改變了場數據類型從typeof(string)typeof(datetime)當我創建的數據表,這解決了問題

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