通常把經常用到的功能塊封裝在一起﹐待用到時統一調用即可﹐這樣可以減少代碼的書寫﹐也利于維護。
對于class的封裝和user control的封裝從原理上還是有些相似。下面舉例說明user control 的使用.
自定義分頁控件﹕
1.
新建項目﹕
GridPage.ascx.
添加以下
control
<%
...
@ Control Language = " C# " AutoEventWireup = " true " CodeFile = " GridPage.ascx.cs " Inherits = " Control_GridPage "
%>
<
asp:Button
ID
="PrePage"
runat
="server"
Text
="PrePage"
OnClick
="PrePage_Click"
/>
<
asp:Button
ID
="NextPage"
runat
="server"
Text
="NextPage"
OnClick
="NextPage_Click"
/>
<
asp:DropDownList
ID
="DropDownList1"
runat
="server"
Width
="55px"
>
</
asp:DropDownList
><
asp:Button
ID
="btnpage"
runat
="server"
Text
="Go"
Width
="43px"
/>
2. 建立屬性﹕注意 ViewState 的用法 : 取得狀態資訊的字典,允許您在相同網頁的多個要求之間,儲存和還原伺服器控制項的檢視狀態 , 通常用在儲存屬性狀態值 。
private
int
pagecount;
public
int
Pagecount
...
{ get ... { return (Int32)ViewState[ " pagecount " ]; } set ... { ViewState[ " pagecount " ] = value; } }
private
string
gridname;
public
string
Gridname
...
{ get ... { return ViewState[ " DataGridName " ].ToString(); } set ... { ViewState[ " DataGridName " ] = value; } }
public
int
pageindex;
public
int
PageIndex
...
{ get ... { return (Int32)ViewState[ " pageindex " ]; } set ... { ViewState[ " pageindex " ] = value; } }
3. 對響應的 control 建立對應的方法控制分頁﹕
protected
void
Page_Load(
object
sender, EventArgs e)
...
{ if ( ! IsPostBack) ... { SetDataBind(PageIndex); } }
public
void
SetDataBind(
int
CurpageIndex)
...
{ // 建立和DataGrid的數據關聯 System.Web.UI.Control ctrl = this .Parent; DataGrid dg = (DataGrid)ctrl.FindControl( this .ViewState[ " DataGridName " ].ToString()); CDAL oDAL = new CDAL(); DataSet ds = oDAL.GetData(CurpageIndex, Pagecount); // 見下面定義 dg.DataSource = ds.Tables[ 0 ]; dg.DataBind(); }
protected
void
NextPage_Click(
object
sender, EventArgs e)
...
{ PageIndex = PageIndex + 1 ; SetDataBind(PageIndex); }
protected
void
PrePage_Click(
object
sender, EventArgs e)
...
{ PageIndex = PageIndex - 1 ; SetDataBind(PageIndex); }
下面是GetData()方法的實現﹕
public
DataSet GetData(
int
pageindex,
int
pagesize)
...
{ // SqlConnection conn = new SqlConnection(ConnStrSql); // conn.Open(); // SqlCommand cmd = new SqlCommand("GetData", conn); // cmd.CommandType = CommandType.StoredProcedure; // cmd.Parameters.AddWithValue("@sMachType", ""); // cmd.Parameters.AddWithValue("@pagecount",pagecount); // cmd.Parameters.AddWithValue("@pagesize", 15); // SqlDataAdapter ada = new SqlDataAdapter(cmd); // DataSet ds = new DataSet(); // ada.Fill(ds); // return ds; // conn.Close(); // ----------------------Oracle Test-------------- OracleConnection conn2 = new OracleConnection(ConnStrOracle); conn2.Open(); OracleCommand cmd2 = new OracleCommand( " GetData " , conn2); // Procedure cmd2.CommandType = CommandType.StoredProcedure; cmd2.Parameters.AddWithValue( " MachType " , "" ); cmd2.Parameters.AddWithValue( " pageIndex " , pageindex); cmd2.Parameters.AddWithValue( " pagesize " , pagesize); cmd2.Parameters.Add( " c " , OracleType.Cursor); cmd2.Parameters[ " c " ].Direction = ParameterDirection.Output; OracleDataAdapter ada2 = new OracleDataAdapter(cmd2); DataSet ds2 = new DataSet(); ada2.Fill(ds2); conn2.Close(); return ds2; }
4.Asp.net 頁面控制 user control:
Html:
1
)添加引用
<%
@ Register Src
=
"
~/Control/GridPage.ascx
"
TagName
=
"
gv
"
TagPrefix
=
"
UserDg
"
%>
2
)實例化
//
此處建立datagrid控件﹕gvContent
<
UserDg:gv ID
=
"
MyDg
"
runat
=
"
server
"
/>
C#﹕ Page_Load事件:給控件屬性賦值 MyDg.Gridname
=
"
gvContent
"
; MyDg.PageIndex
=
1
; MyDg.Pagecount
=
10
;
對應的 Procedure(Oracle
10g
)
CREATE
OR
REPLACE
PROCEDURE
GetData (MachType
in
varchar2
, pageIndex
in
number
, pagesize
in
number
, c out sys_refcursor )
IS
maxcount
number
(
10
); mincount
number
(
10
);
BEGIN
maxcount:
=
pageIndex
*
pagesize; mincount:
=
(pageIndex
-
1
)
*
pagesize;
--
if (MachType='') then
open
c
for
select
*
from
(
select
rownum id,"allinfor".
*
from
"allinfor"
where
rownum
<
maxcount)
where
id
>
mincount;
--
end if;
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
NULL
;
WHEN
OTHERS
THEN
--
Consider logging the error and then re-raise
RAISE;
END
GetData;
Sql server 2005
set
ANSI_NULLS
ON
set
QUOTED_IDENTIFIER
ON
go
ALTER
procedure
[
dbo
]
.
[
getdata
]
@sMachType
varchar
(
20
),
@pageCount
int
,
@pagesize
int
AS
declare
@mincount
int
;
declare
@maxcount
int
;
set
@mincount
=
(
@pagecount
-
1
)
*
@pagesize
;
set
@maxcount
=
@pagecount
*
@pagesize
;
begin
if
object_id
(
'
tmp
'
)
is
not
null
drop
table
tmp;
select
identity
(
int
,
1
,
1
)
as
RowID,
*
into
tmp
from
allinfor;
--
篶Θ斑患糤ID.
if
@sMachType
=
''
begin
select
*
from
tmp
where
RowID
between
@mincount
and
@maxcount
;
end
else
begin
select
*
from
tmp
where
RowID
between
@mincount
and
@maxcount
and
machtype
=
@sMachType
;
end
end