天天看点

ObjectDataSource自定义分页

objectdatasource是唯一支持自定义分页的数据源,要实现分页效果,首先要将objectdatasource.enablepageing属性设为true,通过三个属性实现:startrowindex,maximumrows和selectcountmethod,效果如图:

ObjectDataSource自定义分页
ObjectDataSource自定义分页
ObjectDataSource自定义分页

实现分页有两种情况:一种是假分页,一种是真分页;

假分页:就是将数据全部取出来,只是分页显示,它不是分页取数据,只是分页显示。

真分页:就是按需取数据,只取出每一页所需的数据;这里是使用存储过程做的是真分页。

首先,最重要的是使用到的存储过程:(以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);

}