|
在看貼子http://msdn.microsoft.com/zh-cn/magazine/cc337898.aspx 時(shí),里邊有一段話(huà),如下:
請(qǐng)注意:因?yàn)?DataPager 完全依賴(lài) ListView 執(zhí)行實(shí)際的數(shù)據(jù)分頁(yè),而 ListView 又依賴(lài) DataSource 控件,所以對(duì)于其它數(shù)據(jù)綁定控件也存在相同的分頁(yè)限制。例如,對(duì)于 SqlDataSource 控件,僅當(dāng)其設(shè)置為 DataSet 模式時(shí)分頁(yè)才能正常工作,這意味著需要將整個(gè)結(jié)果集加載到內(nèi)存中才能執(zhí)行分頁(yè)。當(dāng)然,您可以使用自定義 DataSource 控件或使用 ObjectDataSource 控件自定義自己的分頁(yè)。
就來(lái)試一下做一小例子.
1. objectdatasource前端代碼如下:
<asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1"> <ItemTemplate> <tr valign="middle" style="height: 20px;"> <td> <div class="divNewsListInNewsPage aNewsOdcSolutions"> <a href='/news/newsview/apjnews/<%# Eval("ID") %>'> <div><%# Eval("Title")%></div> </a> </div> </td> <td style="width: 150px; COLOR: #006096"> <div style="float: right;" mce_style="float: right;"> <%# Eval("PublishDate") %></div> </td> </tr> </ItemTemplate> <LayoutTemplate> <table runat="server" style="width: 100%"> <tr runat="server" style="height: 350px;" valign="top"> <td runat="server"> <table ID="itemPlaceholderContainer" runat="server" border="0" style="width: 100%"> <tr ID="itemPlaceholder" runat="server"> </tr> </table> </td> </tr> <tr runat="server"> <td runat="server" style="text-align: right" mce_style="text-align: right"> <asp:DataPager ID="DataPager1" runat="server" PageSize='<%$AppSettings:NewsPageSize%>'> <Fields> <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowLastPageButton="True" /> </Fields> </asp:DataPager> </td> </tr> </table> </LayoutTemplate> <EmptyDataTemplate> <table id="Table1" runat="server" style=""> <tr> <td> 未返回?cái)?shù)據(jù)。</td> </tr> </table> </EmptyDataTemplate> </asp:ListView> <%--MaximumRowsParameterName="maximumRows"--默認(rèn)值, 其實(shí)就是pageSize--%> <%--StartRowIndexParameterName="startRowIndex"--默認(rèn)值--%> <%--EnablePaging以前datagrid有個(gè)allowpaging的--%> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" EnablePaging="true" OldValuesParameterFormatString="original_{0}" SelectMethod="SelectAllDataForNewsPageing" SelectCountMethod="SelectCountForContentAllInfo" TypeName="Namespace.Content"> </asp:ObjectDataSource>
SelectMethod是指向的查數(shù)據(jù)方法名字;
SelectCountMethod是指向查找所有數(shù)據(jù)總行數(shù)的方法;
TypeName是上邊兩個(gè)方法所在的類(lèi)的full type name.
selectParameters可以在前端指定或后端代碼指定, 如下:
this.ObjectDataSource1.SelectParameters.Clear(); this.ObjectDataSource1.SelectParameters.Add(new Parameter("url", DbType.String, "aaa.aspx")); this.ObjectDataSource1.SelectParameters.Add(new Parameter("langCode", DbType.String, bp.FrontLanguage)); this.ObjectDataSource1.SelectParameters.Add(new Parameter("codedefault", DbType.String, codedefault)); this.ObjectDataSource1.SelectParameters.Add(new Parameter("maximumRows", DbType.Int32, ConfigurationManager.AppSettings["NewsPageSize"])); this.ObjectDataSource1.SelectParameters.Add(new Parameter("startRowIndex", DbType.Int32, "1"));
2. SelectMethod和SelectCountMethod的指向的方法代碼如下(注意方法的參數(shù)和上面的selectParameters)
public int SelectCountForContentAllInfo(string url, string langCode, string codedefault, int maximumRows, int startRowIndex) { string filterString = " CT_URL='" + url + "' and LangCode='" + langCode + "' "; int returnValue = base.SelectCount<ContentAllInfo>(filterString); //base.SelectCount返回?cái)?shù)據(jù)所有行數(shù) return returnValue; }
public List<ContentAllInfo> SelectAllDataForNewsPageing(string url, string langCode, string codedefault, int maximumRows, int startRowIndex) { List<ContentAllInfo> list = new List<ContentAllInfo>(); string filterString = " CT_URL='" + url + "' and LangCode='" + langCode + "' "; list = base.SelectData<ContentAllInfo>(maximumRows, startRowIndex + 1, " PublishDate desc ", filterString); //.OrderByDescending(ca => ca.PublishDate).ToList();
//base.SelectData是根據(jù)條件, 每頁(yè)顯示行數(shù)參數(shù)值maximumRows(以前叫pagesize), 從那一行開(kāi)始startRowIndex if (list.Count == 0 && langCode.ToLower() != codedefault.ToLower()) { filterString = " CT_URL='" + url + "' and LangCode='" + codedefault + "' "; list = base.SelectData<ContentAllInfo>(maximumRows, startRowIndex + 1, " PublishDate desc ", filterString); }
return list; }
3. 根據(jù)PageSize和startRowIndex查分頁(yè)數(shù)據(jù)的存儲(chǔ)過(guò)程跟一般一樣.
ALTER PROCEDURE [dbo].[存儲(chǔ)過(guò)程名字] @TableName nvarchar(128), @MaxRows int, @StartRow int, @SortExpression nvarchar(200), @FilterString nvarchar(2000) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON;
-- Insert statements for procedure here -- Only for Debug -- SET @TableName = 'tblPurchaseOrder' -- SET @MaxRows = 10 -- SET @StartRow = 1 -- SET @SortExpression = 'OrderDate'
DECLARE @Filter NVARCHAR(2100); DECLARE @SqlString NVARCHAR(4000); DECLARE @ParmDefinition NVARCHAR(500);
DECLARE @EndRow int
SET @EndRow = @MaxRows - 1 + @StartRow
IF @FilterString is null or @FilterString = '' BEGIN SET @Filter = '' END ELSE BEGIN SET @Filter = ' WHERE ('+ @FilterString +') ' END
/* Specify the parameter format one time. */ SET @ParmDefinition = http://www.woyoushebao.com/mailto:N'@StartRowNum int, @EndRowNum int';
SET @SqlString = N' WITH TempTable AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY ' + @SortExpression + ') AS RowNum FROM [' + @TableName + '] ' + @Filter + ' ) SELECT * FROM TempTable WHERE RowNum BETWEEN @StartRowNum AND @EndRowNum ORDER BY ' + @SortExpression PRINT @SqlString
EXECUTE sp_executesql @SqlString , @ParmDefinition , @StartRowNum = @StartRow , @EndRowNum = @EndRow; END
|