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);
}