當我們將資料庫資料取出後,若要以分頁的方式顯示在頁面上,可以使用 ListView 搭配 DataPager 來實作分頁功能,但是若沒有實作資料來源分頁,那麼資料讀取動作會是將所有符合查詢條件的資料從資料庫全部取出後丟給 ListView,再由控制項自行處理要顯示的資料,因為必須將不需顯示的資料也一併從資料庫讀取出來,此種方式會造成資料庫沉重的負擔,在這裡來介紹搭配 ObjectDataSource 的方式來實作資料來源分頁。
先來張執行結果擷圖:
![[C#] 使用 ObjectDataSource 實作資料來源分頁 [C#] 使用 ObjectDataSource 實作資料來源分頁](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNEb3ZMMlpwYkdWekxtUnZkR0pzYjJkekxtTnZiUzUwZHk5M1lXeDBaWEl2TURrd055OVBZbXBsWTNSRVlYUmhVMjkxY21ObFJuVnVZM1JwYjI1ZlEwUkZPUzhsUlRVbE9VWWxRamNsUlRnbFFURWxPRU1sUlRjbFFqVWxPVEFsUlRZbE9VVWxPVU5mZEdoMWJXSXVjRzVu)
先建立 ListView 及 DataPager 物件,來看一下 ASPX 的內容:
02 |
<asp:ListView ID="ListView1" ItemPlaceholderID="phContent" runat="server">
|
04 |
<table width="400px" border="0" cellpadding="4" cellspacing="1" bgcolor="#999999" class="font_02">
|
05 |
<tr style="background:#CCCCCC">
|
06 |
<td width="40%">購買日期</td>
|
07 |
<td width="30%">購買商品</td>
|
08 |
<td width="30%">購買數量</td>
|
10 |
<asp:PlaceHolder ID="phContent" runat="server"></asp:PlaceHolder>
|
14 |
<tr style="background:#FFFFFF">
|
15 |
<td width="40%"><%#DataBinder.Eval(Container, "DataItem.Date") %></td>
|
16 |
<td width="30%"><%#DataBinder.Eval(Container, "DataItem.Name") %></td>
|
17 |
<td width="30%"><%#DataBinder.Eval(Container, "DataItem.Qty") %></td>
|
22 |
<table width="400px" border="0" class="pager">
|
24 |
<asp:DataPager ID="DataPager1" PagedControlID="ListView1" runat="server">
|
26 |
<asp:NextPreviousPagerField ButtonCssClass="font_01" ShowNextPageButton="False" PreviousPageText="上一頁" />
|
27 |
<asp:NumericPagerField ButtonCount="10" NumericButtonCssClass="font_01"
|
28 |
NextPreviousButtonCssClass="font_01" CurrentPageLabelCssClass="font_03" />
|
29 |
<asp:NextPreviousPagerField ButtonCssClass="font_01" ShowPreviousPageButton="False" NextPageText="下一頁" />
|
設定 ListView 及頁碼要顯示的內容及格式,在資料繫結的欄位設定上,我是使用 DataBinder.Eval(Container, "DateItem.Name") 的方式繫結,因為此方式的執行效能較高,參考文章在此。
而 ObjectDataSource 的設定是實作這資料來源分頁很重要的地方,程式碼如下:
01 |
//動態產生 ObjectDataSource 物件 |
02 |
private ObjectDataSource odsList = new ObjectDataSource();
|
04 |
protected void Page_Init(object sender, EventArgs e)
|
06 |
//將 ObjectDataSource 名稱命名為 odsList
|
07 |
odsList.ID = "odsList";
|
09 |
odsList.EnablePaging = true;
|
11 |
odsList.SelectMethod = "QryData";
|
13 |
odsList.SelectCountMethod = "QryData_GetRowCount";
|
14 |
//指出 SelectMethod、SelectCountMethod 方法要去哪個 Class 中調用
|
15 |
odsList.TypeName = "MyFunc";
|
16 |
//呼叫 SelectMethod 時傳入的參數--每頁開始的筆數(由0算起)
|
17 |
odsList.StartRowIndexParameterName = "StartRowIndex";
|
18 |
//呼叫 SelectMethod 時傳入的參數--每頁顯示的筆數(會參考 DataPager 中 PageSize 的設定)
|
19 |
odsList.MaximumRowsParameterName = "MaximumRows";
|
21 |
//將 ObjectDataSource 加入至頁面中
|
22 |
Page.Form.Controls.Add(odsList);
|
25 |
DataPager1.PageSize = MyFunc.cPageSize;
|
27 |
//設定 ListView 在取資料時要參考的資料來源
|
28 |
ListView1.DataSourceID = odsList.ID;
|
31 |
//若要傳遞參數給被呼叫的方法,可用下列方式 |
32 |
protected void Page_PreLoad(object sender, EventArgs e)
|
34 |
//odsList.SelectParameters.Clear();
|
35 |
//設定查詢起迄日期 (名稱須與方法中接收的參數名稱相同)
|
36 |
//odsList.SelectParameters.Add("QryStartDate", "2009/7/1");
|
37 |
//odsList.SelectParameters.Add("QryEndDate", "2009/7/11");
|