简单的自定义分页控件实现(Asp.net)

来源:互联网 发布:加工中心g76编程实例 编辑:程序博客网 时间:2024/05/16 09:14
  
通常把經常用到的功能塊封裝在一起﹐待用到時統一調用即可﹐這樣可以減少代碼的書寫﹐也利于維護。
對于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,1as 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
原创粉丝点击