2016-04-04 20 views
0

ASP.NETリピータを使用して並べ替えを実行する方法に関するアドバイスを受けています。C#ASP.NETリピータ並べ替え

基本的には、ヘッダーフィールドをクリックして繰り返しデータを並べ替えることができます。ここで

<asp:PlaceHolder runat="server" ID="phOrders">  
<table> 
    <thead> 
    <tr> 
     <th>Date</th>   
     <th><asp:LinkButton ID="lnkOrderBy" runat="server" Text="Order Number" OnClick="lnkOrderBy_Click"></asp:LinkButton></th>   
     <th><asp:linkButton ID="lnkOrderByItem" runat="server" Text="Item" OnClick="lnkOrderByIte_Click"></asp:linkButton></th> 
     <th>Size</th>   
     <th>QTY</th> 
     <th>Status</th>   
    </tr> 
    </thead> 
    <tbody> 
    <asp:Repeater ID="rprOrders" runat="server" > 

     <ItemTemplate> 
     <tr> 
      <td><strong><%# Eval("OrderDate") %></strong></td> 
      <td><%# Eval("OrderItemSKUName") %></td> 
      <td><%# Eval("OrderItemSKUID") %></td> 
      <td></td> 
      <td><%# Eval("OrderItemUnitCount") %></td> 
      <td><strong><%# Eval("OrderItemStatus") %></strong></td>    
     </tr> 
     </ItemTemplate> 
    </asp:Repeater> 
    </tbody> 
    </table> 
    <div class="track-footer"></div> 
</asp:PlaceHolder> 

が、私はViewStateにデータを格納し、ソート実行すべき私のリピーターですか?または、クリックイベントごとにデータベースを照会しますか?ここで

はリピーターに

private void PopulateOrders() 
{ 

    CustomerInfo ki = CustomerInfoProvider.GetCustomerInfoByUserID(CooneenHelper.GetUserImpersonisationID()); 
    int nKustomerID = ki.CustomerID; 
    DataTable dts = new DataTable(); 
    dts.Columns.Add("OrderDate", typeof(string)); 
    dts.Columns.Add("OrderItemSKUName", typeof(string)); 
    dts.Columns.Add("OrderItemSKUID", typeof(string)); 
    dts.Columns.Add("OrderItemStatus", typeof(string)); 
    dts.Columns.Add("OrderItemUnitCount", typeof(string)); 

    QueryDataParameters qdp = new QueryDataParameters(); 
    qdp.Add("@CustomerID", nKustomerID); 
    DataSet ds = gc.ExecuteQuery("CN_OrderList", qdp, QueryTypeEnum.StoredProcedure, true); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
    DataRow drNew = dts.NewRow(); 
    drNew["OrderDate"] = ValidationHelper.GetDateTime(dr["OrderDate"], DateTime.Now).ToShortDateString(); 
    drNew["OrderItemSKUName"] = dr["OrderItemSKUName"].ToString(); 
    drNew["OrderItemSKUID"] = dr["OrderItemSKUID"].ToString(); 
    drNew["OrderItemStatus"] = dr["OrderItemStatus"].ToString(); 
    drNew["OrderItemUnitCount"] = dr["OrderItemUnitCount"].ToString(); 
    dts.Rows.Add(drNew); 
    } 

    PagedDataSource pds = new PagedDataSource(); 
    pds.DataSource = dts.DefaultView; 
    DataView view = dts.DefaultView; 

    //allow paging, set page size, and current page 
    pds.AllowPaging = true; 
    pds.PageSize = PerPage; 
    pds.CurrentPageIndex = CurrentPage; 

    //show # of current page in label 
    if (pds.PageCount > 1) litResults.Text += " - Showing page " + (CurrentPage + 1).ToString() + " of " + pds.PageCount.ToString(); 

    //disable prev/next buttons on the first/last pages 
    btnPrev.Enabled = !pds.IsFirstPage; 
    btnNext.Enabled = !pds.IsLastPage; 

    rprOrders.Visible = true; 

    rprOrders.DataSource = pds; 
    rprOrders.DataBind(); 

} 
+0

これは古いasp.netですか?クライアント側のコードと統合するのはひどいですか?私。 mvcじゃない?現代技術(ASP.NET MVC)への移行はオプションですか?それははるかに簡単になり、あなたはクライアントのことをすることができます。 – TomTom

+0

@TomTom MVCはオプションではありません:( – Kevin

+1

これを見てください:http://www.aspdotnet-suresh.com/2014/10/csharp-sorting-columns-in-repeater-control-in-aspnet.html – Zaki

答えて

1

を取り込むための私のコードである私は、ViewStateにデータを格納し、ソート実行すべきか?または、クリックイベントごとにデータベースを照会しますか?

1つの正しい答えはありません - あなたが戻ってあなたがネットワークIOを使用していますが、常に最新のデータを取得し、データベースへ行けば、しかしデータは、現在画面に表示されるものと一致しない場合があること。 ViewState vs Session vs Cacheに関するいくつかの調査を行い、どちらがあなたのニーズを最もよく満たしているか調べてください。いずれかの企業は、データを簡単に取得してクライアント入力に基づいてソートできるようにデータを格納できます。

1

ページングを使用している場合、再クエリーの必要性について心配していないことがわかります。つまり、セッションからの解決は完全に合理的です。 (他の理由をソートやための)データベースを再クエリするという決定はいくつかの要因に基づいて決定されるべきである

  • データに(追加及び 削除を含む)変更された可能性は何ですかユーザーが最初にデータを見たときから、再ソートを選択する可能性がある場合は となりましたか?また、 の更新を参照することは重要ですか?
  • セッションはユーザー単位のストアです。各ユーザーがサーバーのメモリに保持する行の数に応じて、最終的にサーバーに課金される可能性があります。セッションが終了するとどうなりますか?
  • データを再クエリするコスト(時間、サーバー処理能力など)はどれくらいですか?

これは(特にその最後の質問で)場合に役立ちます私は知らないが、あなたは、DataTableの(ds.Tables [0] .Rows)を巡回し、別のDataTable(DTS)を作成しているようです。その処理は本当に必要ですか?それは有用な何もしていないように見えますが、それはちょうどこの例です。 :)

このコードでは、必要でないと思われるものをコメントアウトしました。彼らが実際の状況で意味をなさない場合、それらを戻すことを自由に感じてください。

私はinitで1に設定する必要があるisFirstTripという名前のページグローバル変数(定義する必要があります)を追加しました。データベースを再クエリする必要があるときはいつでも新しい検索をしますか?)。

private void PopulateOrders() 
{ 
    if (isFirstTrip == 1) 
    { 
    CustomerInfo ki = CustomerInfoProvider.GetCustomerInfoByUserID(CooneenHelper.GetUserImpersonisationID()); 
    int nKustomerID = ki.CustomerID; 
    /* 
    DataTable dts = new DataTable(); 
    dts.Columns.Add("OrderDate", typeof(string)); 
    dts.Columns.Add("OrderItemSKUName", typeof(string)); 
    dts.Columns.Add("OrderItemSKUID", typeof(string)); 
    dts.Columns.Add("OrderItemStatus", typeof(string)); 
    dts.Columns.Add("OrderItemUnitCount", typeof(string)); 
    */ 

    QueryDataParameters qdp = new QueryDataParameters(); 
    qdp.Add("@CustomerID", nKustomerID); 
    session("OrderList") = gc.ExecuteQuery("CN_OrderList", qdp, QueryTypeEnum.StoredProcedure, true); 

    /*DataSet ds = gc.ExecuteQuery("CN_OrderList", qdp, QueryTypeEnum.StoredProcedure, true); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     DataRow drNew = dts.NewRow(); 
     drNew["OrderDate"] = ValidationHelper.GetDateTime(dr["OrderDate"], DateTime.Now).ToShortDateString(); 
     drNew["OrderItemSKUName"] = dr["OrderItemSKUName"].ToString(); 
     drNew["OrderItemSKUID"] = dr["OrderItemSKUID"].ToString(); 
     drNew["OrderItemStatus"] = dr["OrderItemStatus"].ToString(); 
     drNew["OrderItemUnitCount"] = dr["OrderItemUnitCount"].ToString(); 
     dts.Rows.Add(drNew); 
    }*/ 
    } 
    isFirstTrip = 0; 
    PagedDataSource pds = new PagedDataSource(); 
    pds.DataSource = DirectCast(session("OrderList"),DataTable).DefaultView; 
    //pds.DataSource = dts.DefaultView; 
    //DataView view = dts.DefaultView; <- Not used 

    //allow paging, set page size, and current page 
    pds.AllowPaging = true; 
    pds.PageSize = PerPage; 
    pds.CurrentPageIndex = CurrentPage; 

    //show # of current page in label 
    if (pds.PageCount > 1) litResults.Text += " - Showing page " + (CurrentPage + 1).ToString() + " of " + pds.PageCount.ToString(); 

    //disable prev/next buttons on the first/last pages 
    btnPrev.Enabled = !pds.IsFirstPage; 
    btnNext.Enabled = !pds.IsLastPage; 

    rprOrders.Visible = true; 

    rprOrders.DataSource = pds; 
    rprOrders.DataBind(); 

} 
+0

セッションを通してどのようにするのか教えていただけますか? – Kevin

+1

基本的に、データベースコードの大部分をIFにラップして、初めてPopulateOrdersを実行して初めてデータベースにヒットしたかどうかを確認しました。セッション。あなたはまた、セッション( "注文何か小さなもの(長さがゼロの文字列のようなもの)でページを離れる準備をしているときに、何の理由もなくメモリに詰まらないようにしてください。 –

+0

この例のおかげでSteve Barronに感謝します。それは今よりずっと意味をなさない。しかし、私はどのようにデータをソートするために上記を適用できるか分からないのですか?私は例http://shravanti88.blogspot.co.uk/2012/03/sorting-in-repeater.htmlに従うことを試みていますか? – Kevin