前提:學習牛腩的時候,只學會了用Gridview實現假分頁;據說Repeater是沒有分頁功能的。
背景: Asp.net提供了三個功能強大的列表控件:Gridview、DataList和Repeater控件,但其中只有Gridview控件提供分頁功能。相對Gridview,DataList和Repeater控件具有更高的樣式自定義性,所以很多時候我們喜歡使用DataList或Repeater控件來顯示數據。那麼,有沒有一種辦法讓DataList和Repeater控件也能實現分頁呢?
Gridview能實現分頁的原因是:PagedDataSource 類封裝Gridview 控件的屬性,這些屬性使 Gridview 可以執行分頁。
最後的結論:通俗的講就是Gridview控件就是使用PagedDataSource類來實現數據分頁顯示的,所以DataList和Repeater也同樣可以使用PagedDataSource來顯示分頁。它們實現的方法都是一樣兒一樣兒的。
實現過程:
前臺代碼:
<h1>分頁顯示</h1>
<p>
<asp:Label ID="Label2" runat="server" Text="當前頁:"></asp:Label>
<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上一頁" />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="下一頁" />
</p>
<asp:Panel ID="Panel1" runat="server" Height="315px">
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate >
<tr>
<td>
<%#DataBinder .Eval (Container .DataItem ,"UserName") %>
<%#DataBinder .Eval (Container .DataItem ,"Level") %>
</td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate >
<font color="blue">
<tr>
<td>
<%#DataBinder .Eval (Container .DataItem ,"UserName") %>
<%#DataBinder .Eval (Container .DataItem ,"Level") %>
</td>
</tr>
</font>
</AlternatingItemTemplate>
<HeaderTemplate >
<h3>模板頁眉</h3>
<table border ="1">
<tr>
<td>
員工名字
</td>
</tr>
</HeaderTemplate>
<FooterTemplate>
</table>
<h3>模板頁腳</h3>
</FooterTemplate>
<SeparatorTemplate>
</SeparatorTemplate>
</asp:Repeater>
</asp:Panel>
後臺代碼:
public partial class repeaterControl : System.Web.UI.Page
{
/// <summary>
/// 窗體加載
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack) //如果是第一次加載界面,就執行下面的(第一次加載IsPostback是false,因此取相反值。)
{
this.Label3.Text ="1"; //讓顯示頁碼的標籤爲1
this.databindToRepeater();//調用綁定數據源的方法
}
}
/// <summary>
/// 綁定數據
/// </summary>
private void databindToRepeater()
{
int curpage = Convert .ToInt32 ( this.Label3.Text);//定義當前頁碼
SqlConnection con = DB.createCon();//調用DB連接數據庫
SqlDataAdapter sda = new SqlDataAdapter();//sqlDataadapter的作用是實現Dataset和DB之間的橋樑
sda.SelectCommand = new SqlCommand("select * from Users", con);
DataSet ds = new DataSet();
sda.Fill(ds, "user");// Fill它可填充DataSet中的數據以匹配數據源中的數據
System.Web.UI.WebControls.PagedDataSource ps = new PagedDataSource();//執行分頁
ps.DataSource = ds.Tables["user"].DefaultView;//直接將視圖作爲數據源
ps.AllowPaging = true;//允許分頁
ps.PageSize =3;//每一頁多少行
ps.CurrentPageIndex = curpage - 1;//當前頁碼
this.Button1.Enabled = true;
this.Button2.Enabled = true;
if (curpage ==1)
{
this.Button1.Enabled = false;//如果頁碼爲1,則上一頁的按鈕不能用
}
if (curpage ==ps.PageCount )
{
this.Button2.Enabled = false;//如果頁碼爲最大,則下一頁的按鈕不能用
}
this.Repeater1.DataSource = ps;
this.Repeater1.DataBind();
}
/// <summary>
/// 上一頁
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
this.Label3.Text = Convert.ToString(Convert.ToInt32(this.Label3.Text) -1);
this.databindToRepeater();
}
/// <summary>
/// 下一頁
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
this.Label3.Text =Convert .ToString ( Convert.ToInt32(this.Label3.Text) + 1);
this.databindToRepeater();
}
}
結果:
總結:這就是我們常說的假分頁,從數據庫一次性取出所有數據綁定到控件上,再將所有數據根據每頁顯示多少條記錄而分頁。真分頁雖然已經瞭解了,但是還沒有正實踐過,期待真分頁的到來!