簡體   English   中英

C#ASP.NET中繼器排序

[英]C# ASP.NET Repeater Sorting

我對如何使用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();

}

我應該將數據存儲在ViewState中然后進行排序嗎? 還是在數據庫中查詢每次單擊事件?

沒有一個正確的答案-如果您返回數據庫,則使用網絡IO,但始終會獲得新數據,但是這些數據可能與您當前在屏幕上看到的數據不匹配。 ViewState,Session,Cache進行一些研究,以了解哪一種最能滿足您的需求。 這些中的任何一個都可以以易於取回的方式存儲數據,並讓您根據客戶的輸入對其進行排序。

如果您使用的是Paging,那就告訴我您不擔心需要重新查詢-因此從Session進行恢復似乎是完全合理的。

(基於排序或任何其他原因)重新查詢數據庫的決定應基於以下幾個因素來確定:

  • 在用戶第一次看到數據之間以及他們選擇重新排序之間,數據發生更改(包括添加和刪除)的可能性有多大?或者他們看到更新是否重要?
  • 會話是按用戶存儲。 根據每個用戶在服務器內存中保留的行數,最終可能會對服務器造成負擔。 會話過期時會發生什么?
  • 重新查詢數據的成本(時間,服務器處理能力等)是多少?

我不知道這是否有幫助(尤其是最后一個問題),但是您似乎正在遍歷DataTable(ds.Tables [0] .Rows)並創建另一個DataTable(dts)。 那個處理真的必要嗎? 它似乎並沒有做任何有用的事情-但這也許僅僅是這個例子。 :)

在這段代碼中,我注釋了很多似乎不必要的事情。 如果在實際情況中有意義,請隨時將其帶回。

我還添加了一個名為isFirstTrip的頁面全局變量(需要定義),您需要在初始化時或需要重新查詢數據庫的任何時間(例如,當用戶進行新搜索時)將其設置為1。 ?)。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM