objectdatasource是唯一支援自定義分頁的資料源,要實作分頁效果,首先要将objectdatasource.enablepageing屬性設為true,通過三個屬性實作:startrowindex,maximumrows和selectcountmethod,效果如圖:
實作分頁有兩種情況:一種是假分頁,一種是真分頁;
假分頁:就是将資料全部取出來,隻是分頁顯示,它不是分頁取資料,隻是分頁顯示。
真分頁:就是按需取資料,隻取出每一頁所需的資料;這裡是使用存儲過程做的是真分頁。
首先,最重要的是使用到的存儲過程:(以northwind資料庫為例)
alter procedure getemployeepage
@start int, @count int
as
-- 建立一張臨時表,增加id屬性列。
create table #tempemployees
(
id int identity primary key,
employeeid int,
lastname nvarchar(20),
firstname nvarchar(10),
titleofcourtesy nvarchar(25),
)
-- 用employees表的相關字段來填充臨時表。
insert into #tempemployees
employeeid, lastname, firstname, titleofcourtesy
select
from
employees order by employeeid asc
-- 聲明兩個變量來計算的記錄的範圍。
declare @fromid int
declare @toid int
-- 計算我們需要的第一個和最後一個編号的各種記錄。
set @fromid = @start
set @toid = @start + @count - 1
-- 查找一頁顯示的内容。
select * from #tempemployees where id >= @fromid and id <= @toid
其次,就是調用存儲過程的資料通路類:
public class employeespager
{
public employeespager()
}
private string connectionstring;
public list<employeedetails> getemployees(int startrowindex, int maximumrows)
connectionstring = webconfigurationmanager.connectionstrings["northwind"].connectionstring;
sqlconnection con = new sqlconnection(connectionstring);
sqlcommand cmd = new sqlcommand("getemployeepage", con);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(new sqlparameter("@start", sqldbtype.int, 4));
cmd.parameters["@start"].value = startrowindex +1;
cmd.parameters.add(new sqlparameter("@count", sqldbtype.int, 4));
cmd.parameters["@count"].value = maximumrows;
// create a collection for all the employee records.
list<employeedetails> employees = new list<employeedetails>();
try
con.open();
sqldatareader reader = cmd.executereader();
while (reader.read())
employeedetails emp = new employeedetails(
(int)reader["employeeid"], (string)reader["firstname"],
(string)reader["lastname"], (string)reader["titleofcourtesy"]);
employees.add(emp);
reader.close();
return employees;
catch (sqlexception err)
// replace the error with something less specific.
// you could also log the error now.
throw new applicationexception("data error.");
finally
con.close();
最後,就是前台界面調用這個通路類的方法:
protected void page_load(object sender, eventargs e)
employeespager emp = new employeespager();
gridview1.datasource = emp.getemployees(0, 5);//預設顯示前5條記錄;
gridview1.databind();
if (!ispostback)
for (int i = 1; i < 10; i++)
dropdownlist1.items.add(i.tostring());
protected void dropdownlist1_selectedindexchanged(object sender, eventargs e)
gridview1.datasource = emp.getemployees((convert.toint32(dropdownlist1.selecteditem.text)-1),3);
}