[英]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.