Phân trang DataList, GridView, Repeater với CollectionPager ASP.Net C# Tóm tắt: Có 1 điều mà các lập trình viên rất hay gặp phải khi lập trình với ASP.Net, đó là
phân trang khi sử dụng DataList và Repeater ( còn GridView thì VS 2005 đã hỗ trợ sẵn) Trong bài viết này tôi giới thiệu với các bạn 1 class library được viết sẵn để sử lý các vấn đề này một cách hết sức đơn giản, khả năng tùy biến của nó cũng là khá hay, đó chính là CollectionPager.dll Gửi cho bạn bè | Gửi bởi:
Scorpion -- Thời gian: 1/22/2011 6:10:48 PM
Có 1 điều mà các lập trình viên rất hay gặp phải khi lập trình với ASP.Net, đó là phân trang khi sử dụng DataLis Repeater ( còn GridView thì VS 2005 đã hỗ trợ sẵn) Trong bài viết này tôi giới thiệu với các bạn 1 class library viết sẵn để sử lý các vấn đề này một cách hết sức đơn giản, khả năng tùy biến của nó cũng là khá hay, đó chín CollectionPager.dll Trước hết bạn phải download file dll trên ở đây: Download Cách sử dụng hết sức đơn giản: 1) Tạo 1 website mới trong VS. 2) Kích chuột phải vào tên Website chọn Add References, chọn đến file dll mà bạn vừa giải nén ra, rồi OK. Tại trang code .aspx khai báo để sử dụng CollectionPager <%@ <% @ Register TagPrefix TagPrefix="cc1" ="cc1" Namespace Namespace="SiteUtils" ="SiteUtils" Assembly Assembly="CollectionPager" ="CollectionPager" %> Tiếp theo, kéo vào 1 DataList, đặt tên là dtlMessages
="server"> > Gọi 1 control CollectionPager (cái này bạn có thể đặt ở một vị trí bất kỳ trong trang)
="PostBack"> cc1 cc1::CollectionPager CollectionPager> > Bạn có thể tùy biến các Label theo ý muốn của bạn, như ở đây tôi đã customize về tiếng Việt. Như vậy là bạn đã xong bước khai báo, và đưa các control cần sử dụng vào trong trang web của mình. Tại trang codebehind, các bạn lấy ra một DataSet chứa dữ liệu cần phân trang, đặt tên là ds, sau đó viết đoạn sau: CollectionPager1.MaxPages CollectionPager1.Max Pages = 10000;
CollectionPager1.PageSize = 10; // số items hiển thị trên một trang CollectionPager1.DataSource = ds.Tables[0].DefaultView; CollectionPager1.BindToControl = dtlMessages; dtlMessages.DataSource = CollectionPager1.DataSourcePaged; dtlMessages.DataBind(); Rất đơn giản phải không các bạn, chúc các bạn thành công! Chuong 12. Sử dụng Repeater và DataList
Cả hai điều khiển này đều cho phép hiển thị tập hợp các mục dữ liệu tại một thời điểm, nói cách khác là có thể hiển thị tất cả các dòng trong bảng dữ liệu. I. sử dụng điều khiển Repeater 1. Hiển thị dữ liệu với Repeater
Để hiển thị dữ liệu với Repeater bạn phải tạo một ItemTemplate Ví dụ: trang Repeater.aspx <%@ Page Language="C#" AutoEventWireup="true" e="Repeater.aspx.cs" Inherits="_Default"%>
CodeFil
Repeater
Bạn đưa điều khiển Repeater vào Form và đặt thuộc tính DataSourceID=”SqlDataSource1” và thêm vào một ItemTemplate trong này bạn có thể điều chỉnh cách hiển thị dữ liệu theo ý muốn của bạn với các thẻ của Asp.Net hoặc HTML. Kết xuất của đoạn Code trên sẽ như sau:
2. Sử dụng Template với điều khiển Repeater
Điều khiển Repeater hỗ trợ 5 kiểu của Templates ItemTemplate: định dạng mỗi item từ nguồn dữ liệu AlternatingItemTemplate: định dạng tất cả các item dữ liệu khác từ nguồn dữ liệu SeparatorTemplate: định dạng giữa hai item từ nguồn cơ sở dữ liệu HeaderTemplate: Định dạng header cho tất cả các item FooterTemplate: Định dạn Footer cho tất cả các item. Ví dụ: trang RepeaterDP.aspx • •
• • •
<%@ Page Language="C#" AutoEventWireup="true" e="RepeaterDP.aspx.cs"Inherits="_Default" %>
CodeFil
Repeater
Kết xuất của chương trình:
3. Điều khiển Repeater với các sự kiện
Điểu khiển Repeater hỗ trợ các sự kiện sau: DataBinding: xảy ra khi Repeater được rạng buộc đến dữ liệu ItemCommand: xảy ra khi bên trong Repeater chứa đựng điều khiện Command và điều khiển này đưa ra sự kiện. ItemCreate: xảy ra khi mỗi RepeaterItem được tạo ItemDataBound: xảy ra khi mỗi item của Repeater được ràng buộc Ví dụ trang RepeaterEvent.aspx • •
• •
<%@ Page Language="C#" AutoEventWireup="true" CodeFil e="RepeaterEvent.aspx.cs"Inherits="_Default" %> <script runat="server"> void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { Response.Write("Dữ liệu đang được tạo"); } void repeater1_DataBinding(object sender, EventArgs e) { Response.Write("Ràng buộc dữ liệu cho Repeater"); } void Repeater1_ItemCommand(object sender, RepeaterCommandEventArgs e) { switch (e.CommandName) { case "insert": Response.Write(e.CommandArgument.ToString() + ": Bạn chọn xoá dữ liệu");
break; case "update": Response.Write(e.CommandArgument.ToString() + ": Bạn chọn cập nhật dữ liệu"); break; case "delete": Response.Write(e.CommandArgument.ToString() + ": Bạn chọn xoá dữ liệu"); break; } } Repeater
Ví dụ trên bạn đưa vào 3 sự kiện cho điều khiển Repeater, tương ứng với nó là 3 sự kiện được kích hoạt: sự kiện Repeater1_ItemDataBound được đưa ra làm và nó được thực hiện mỗi khi dữ liệu hay một item được đưa vào Repeater với ví dụ trên nó sẽ in ra “dữ liệu đang được tạo” x(số hàng trong bảng dữ liệu) lần. repeater1_DataBinding thực hiện công việc khi dữ liệu được điền vào Repeater. Repeater1_ItemCommand: phụ thuộc vào tên CommandName để đưa ra công việc thích hợp(nếu chưa rõ CommandName bạn xem lại phần Các điều khiển cơ bản của ASP.NET)
II. Sử dụng điều khiển DataList 1. Hiển thị dữ liệu với DataList
Ví dụ: trang DataList.aspx <%@ Page Language="C#" AutoEventWireup="true" e="DataList.aspx.cs" Inherits="_Default"%>
CodeFil
Repeater
2.
Hiển thị dữ liệu trong nhiều cột
Bạn có thể hiển thị dữ liệu trong điều khiển DataList trong nhiều cột giống như mỗi item nằm trong một Cells với 2 thuộc tính của Repeater là: RepeaterColumns: số cột hiển thị RepeateDirection: hướng để hiển thị các ô. Có thể giá trị là Horizontal hoặc Verical Ví dụ sau đây sẽ hiển thị dữ liệu trong DataList với 3 cột Ví dụ trang DataListMutilColumn.aspx • •
<%@ Page Language="C#" AutoEventWireup="true" CodeFil e="DataListMutilColumn.aspx.cs"Inherits="_Default" %>
Repeater
Ở đây bạn chỉ cần thêm RepeaterColumns=”3” và GridLines=”Both” kết xuất của chương trình sau:
vào
hai
thuộc
tính
3. Sử dụng Template với điều khiển DataList
DataList hỗ trợ tất cả các templates giống với Repeater và nó được thêm vào hai templates: EditItemTemplate: hiển thị khi dòng được chọn để chỉnh sửa SelectedItemTemplate: được hiển thị khi 1 dòng được lựa chọn • •
4. Chọn dữ liệu với điều khiển DataList
Bạn có thể sử dụng DataList như một menu bằng việc thêm vào thuộc tính SelectedValue Ví dụ: trang DataListselect.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFil e="DataListselect.aspx.cs"Inherits="_Default" %> Repeater
Trong ví dụ trên Datalist1 dùng làm menu trong ItemTemplate chúng ta đưa vào một LinkButton và cung cấp cho nó thuộc tính CommandName=”Select”. Ta tiếp tục đưa thêm vào một SqlDataSource2 với việc đưa vào một tham số nhận giá trị về từ Datalist1 với tham số truyền pkIntrodureID, và chúng ta đưa thêm vào một Datalist2 với DataSourceID=”SqlDataSource2”. Như vậy khi chạy chương trình bạn nhấn vào mỗi mục trong Datalist1 thì dữ liệu đầy đủ tương ứng sẽ hiện trong trong DataList2 Thay đổi dữ liệu với điều khiển DataList Bạn có thể sử dụng DataList để thay đổi dữ liệu bản ghi. Tuy nhiên để chỉnh sửa dữ liệu của bản ghi nó yêu cầu nhiều phải viết nhiều code hơn so với các điều khiển ràng buộc dữ liệu khác như GridView, FormView hay DetailView. Ví dụ sau đây sẽ hương dẫn bạn cách thay đổi và xoá dữ liệu từ DataList. <%@ Page Language="C#" AutoEventWireup="true" CodeFil e="Repeateredit.aspx.cs"Inherits="Repeateredit" %> <script runat="server"> void DataList1_EditCommand(object sender, DataListCommandEventArgs e)
{ DataList1.EditItemIndex = e.Item.ItemIndex; DataList1.DataBind(); } void DataList1_DeleteCommand(object sender, DataListCommandEventArgs e) { SqlDataSource1.DeleteParameters["pkIntrodureID"].DefaultValue = DataList1.DataKeys[e.Item.ItemIndex].ToString(); SqlDataSource1.Delete(); } void DataList1_UpdateCommand(object sender, DataListCommandEventArgs e) { TextBox txtTitle = (TextBox)e.Item.FindControl("txtTitle"); TextBox txtSummary = (TextBox)e.Item.FindControl("txtSummary"); SqlDataSource1.UpdateParameters["pkIntrodureID"].DefaultValue = DataList1.DataKeys[e.Item.ItemIndex].ToString(); SqlDataSource1.UpdateParameters["sTitle"].DefaultValue = txtTitle.Text; SqlDataSource1.UpdateParameters["sSummary"].DefaultValue = txtSummary.Text; SqlDataSource1.Update(); DataList1.EditItemIndex = -1; } void DataList1_CancelCommand(object sender, DataListCommandEventArgs e) { DataList1.EditItemIndex = -1; DataList1.DataBind(); } Repeater
Cách thao tác dữ liệu với DataList gần giống với FormView. Để làm được việc này bạn cần cung cấp các button có CommandName ứng với các phương thức mà được DataList hỗ trợ . cùng với việc đưa vào các tham số tương ứng trong thành phần UpdateParameter và DeleteParameter của SqlDataSource.