2016-04-10 7 views
0

グリッドビューのソートに問題があります。常に1つのソート順、つまり昇順にあるようです。 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は常に昇順として示していますか? Page Load

<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

私はSOの質問 GridView sorting: SortDirection always Ascendingを見上げるとこれに私の並べ替えイベントを修正Kostrzakからいくつかのアドバイスをして[OK

......

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

日付の順序は降順です。

2016年3月8日
2016年2月10日
2016年1月22日
2016年1月22日
2016年1月22日
2016年1月22日
2016-01- gridvieに日付欄をクリックした後、22
2016年1月22日
2015年11月11日
2015年11月11日

それは次のように昇順に行くべきワット:

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

Iこの注文にどうやって届くのかわからないのですか?

+2

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

前に問題

を解消すると、だから私はSOにすでに同様の問題がありましたtypeof(datetime)typeof(string)からフィールドのデータ型を変更します。http:/ /stackoverflow.com/questions/250037/gridview-sorting-sortdirection-always-ascending – Kostrzak

+0

ありがとう、Kostrzak私は質問を更新しました。 – Kevin

+1

SortingイベントハンドラのGridViewからDataTableを補充する必要がありますか? 'PopulateOrderList'を呼び出すと同じことはできませんか?もう1つのポイント:ソートは、日付が文字列ではなく日付フィールドにある場合、より予測可能です。おそらく 'PopulateOrderList'を呼び出すことでその問題が解決されるでしょう。 – ConnorsFan

答えて

0

問題が見つかりました。ConnorsFanが指摘したように、OrderDateフィールドはDateTimeフィールドの代わりに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)); 
関連する問題