Tác giả |
|
DUCVINH83 Administrator
Không ngừng học hỏi !
Ngày gia nhập: 01/11/2005 Giới tính: Đến từ: Vietnam
Trạng thái: Bài viết: 365 Tiền: 738$ Địa chỉ e-mail: Yahoo! IM: Sinh nhật: 17/02/1983 Cảnh cáo: (0%)
|
Ngày gửi: 05/06/2009 lúc 9:32 sáng | Đã khóa IP
|
|
|
|
Một ví dụ và hướng dẫn cách làm về paging-phân trang trong asp.net. |
* Tại sao phải paging?Vì làm như vậy để tăng tốc độ truy cập cho trang web,thẩm mỹ... * Quan trọng nhất của paging là gì?Là việc lấy dữ liệu làm sao cho chính xác! Việc này nhờ vào 1 store sau ------------------- set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go
ALTER PROCEDURE [dbo].[usp_PagingData] @pageNum int, @pageSize int AS Begin Begin WITH s AS ( SELECT ROW_NUMBER() OVER(ORDER BY FirstName, UserID) AS RowNum, * FROM dbo.[user] ) Select * From s Where RowNum Between (@pageNum - 1) * @pageSize + 1 AND @pageNum * @pageSize End Select Count(*) as Total from [user] End ---------------------- Store này có 2 thông số : * @pageNum :Trang hiện tại * @pageSize : số bản ghi muốn hiển thị trên 1 trang Trả về : * Những bản ghi mong muốn * Tổng số bản ghi Vậy là xong phần database,phần còn lại là viết code trên .NET.
__________________
YM: DUCVINH83
0912 822334
|
Lên trên |
|
|
DUCVINH83 Administrator
Không ngừng học hỏi !
Ngày gia nhập: 01/11/2005 Giới tính: Đến từ: Vietnam
Trạng thái: Bài viết: 365 Tiền: 738$ Địa chỉ e-mail: Yahoo! IM: Sinh nhật: 17/02/1983 Cảnh cáo: (0%)
|
Ngày gửi: 05/06/2009 lúc 9:33 sáng | Đã khóa IP
|
|
|
|
Như
ở phần I đã nói cách làm sao lấy được dữ liệu từ database,bây giờ là
phần phía trên .NET-dùng 1 cái DataGrid để làm.Bạn hoàn toàn có thể
dùng GridView để làm,đến đây chỉ phụ thuộc vào việc bạn muốn thể hiện
ra làm sao thôi.
Cơ chế hoạt động như sau: khi web được
load lần đầu tiên BindData sẽ lẫy dữ liệu của trang đầu tiền đó vào
grid,đồng thời trong hàm này có việc gán property grid.VirtualItemCount
= (int)dr[0]; đây là thuộc tính của DataGrid lưu lại tổng số bản ghi
của table trả về và dùng nó để chia cho PageSize để ra được số lượng
trang. DataReader mỗi lần đọc chỉ lấy 1 bản ghi tức là trong bản ghi đó có Tại
sao phải thêm lớp UserPT? Vì DataReader mỗi lần đọc chỉ lấy 1 bản ghi
tức là trong bản ghi đó có FirstName, LastName ... vậy nên lớp này dùng
để chứa dữ liệu tạm thời rồi đổ nó vào trong 1 ArrayList và từ
ArrayList này đổ vào grid.Bạn có thể debug sẽ thấy mỗi lần thay đổi
trang,số bản ghi trong biến list chỉ bằng số pageSize mà bạn đã định ra
ở trên grid lúc đầu (PageSize="5"). Như vậy web sẽ chạy nhanh hơn.Hãy
thử test nó với 1 database khoảng 1000 bản ghi,bạn sẽ thấy sự khác biệt
giữa cách dùng DataSet.
Giao diện (*.aspx) : <asp:DataGrid ID="grid" runat="server" AllowCustomPaging="true" AllowPaging="true" AutoGenerateColumns="false" PageSize="5"> <Columns> <asp:BoundColumn DataField="FName" HeaderText="First Name"></asp:BoundColumn> <asp:BoundColumn DataField="LName" HeaderText="Last Name"></asp:BoundColumn> <asp:BoundColumn DataField="LoginName" HeaderText="Login Name"></asp:BoundColumn> </Columns> <PagerStyle Mode="NumericPages" /> </asp:DataGrid>
Code Behind: -------------------------------- protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindData(grid.CurrentPageIndex + 1, grid.PageSize); } }
protected override void OnInit(EventArgs e) { base.OnInit(e); //dang ki event khi ban chuyen Page grid.PageIndexChanged += new DataGridPageChangedEventHandler(grid_PageIndexChanged); }
void grid_PageIndexChanged(object source, DataGridPageChangedEventArgs e) { //cap nhat lai page vua duoc chuyen toi grid.CurrentPageIndex = e.NewPageIndex; BindData(grid.CurrentPageIndex + 1, grid.PageSize); }
protected void BindData(int page, int pageSize) { //day la chuoi ket noi de sqlserver ban phai viet lai cho phu hop
string connStr = "data
source=SQLSERVER;database=PT2;user=sa;password=tc0ffs h0re;Min Pool
Size=3;Max Pool Size=10;Connect Timeout=30;"; SqlConnection conn = new SqlConnection(connStr); ArrayList list = new ArrayList(); try { conn.Open(); SqlCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "usp_PagingData"; SqlParameter[] sqlParams = new SqlParameter[2]; sqlParams[0] = new SqlParameter("@pageNum", page); sqlParams[1] = new SqlParameter("@pageSize", pageSize); cmd.Parameters.AddRange(sqlParams); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { serPT item = new UserPT(); item.FName = (string)dr["FirstName"]; item.LName = (string)dr["LastName"]; tem.LoginName = (string)dr["LoginName"]; list.Add(item); }
if (dr.NextResult()) { if (dr.Read()) { grid.VirtualItemCount = (int)dr[0]; } }
grid.DataSource = list; grid.DataBind(); } catch (Exception) { throw; } finally { conn.Close(); } }
Chèn
thêm lớp UserPT vào để làm chỗ chứa dữ liệu khi lấy từ DataReader ra.Vì
trong web chúng ta không nên dùng DataSet-sẽ làm giảm tốc độ của
web.Nên dùng DataReader.
public class UserPT { private string fName; private string lName; private string loginName;
public string FName { get { return this.fName; } set { this.fName = value; } }
public string LName { get { return this.lName; } set { this.lName = value; } }
public string LoginName { get { return this.loginName; } set { this.loginName = value; } }
public UserPT() { } }
chungta.com
|
__________________
YM: DUCVINH83
0912 822334
|
Lên trên |
|
|
|
|