天天看點

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

}