gaoxiang

专注于.NET技术

博客园 首页 新随笔 联系 订阅 管理

1.建立用户控件Pager.ascx

1.1 html

<script language="javascript">    
    
function callButtonEvent()
    
{
        
var keycode =window.event.keyCode;
        
if(keycode==13)
        
{
            
if(check()==true)
            
{
                event.cancelBubble
=true;
                event.returnValue
=false;
                document.getElementById('
<%=btnGo.ClientID%>').click();
            }

        }

    }

    
function check()
    
{
        
var count =  parseInt(document.getElementById('<%=lblTotal.ClientID%>').outerText);
        
var txt = document.getElementById('<%=txtCurrentPage.ClientID%>').value;
        
var cur = parseInt(txt);
        
if ((cur | NaN) ==0)
        
{
            alert('Input page must format as integer.');            
            event.cancelPostBack
=true;            
            
return false;
        }

        
if (cur > count || cur < 1)
        
{
            alert('Input page no out of range.');            
            event.cancelPostBack
=true;
            
return false;
        }

    }

</script>
<TABLE ID="Table1" CELLSPACING="0" CELLPADDING="0" WIDTH="100%" BORDER="0">
    
<colgroup>
        
<col width="400">
        
<col width="50">
        
<col width="50">
        
<col width="40">
        
<col width="20">
        
<col width="40">
        
<col width="40">
        
<col width="50">
        
<col width="70">
    
</colgroup>
    
<TR align="right">
        
<td></td>
        
<TD><asp:LinkButton id="btnFirstPage" runat="server" CommandArgument="First">第一页</asp:LinkButton></TD>
        
<TD><asp:LinkButton id="btnPrevPage" runat="server" CommandArgument="Prev">上一页</asp:LinkButton></TD>
        
<TD><ASP:TEXTBOX ID="txtCurrentPage" RUNAT="server" MAXLENGTH="3" Width="40">0</ASP:TEXTBOX></TD>
        
<TD><ASP:LABEL ID="labOf" RUNAT="server">of</ASP:LABEL></TD>
        
<TD><ASP:LABEL ID="lblTotal" RUNAT="server">0</ASP:LABEL></TD>
        
<TD><ASP:BUTTON ID="btnGo" RUNAT="server" TEXT="转到" COMMANDARGUMENT="Go" ToolTip="转到"></ASP:BUTTON></TD>
        
<TD><asp:LinkButton id="btnNextPage" runat="server" CommandArgument="Next">下一页</asp:LinkButton></TD>
        
<TD><asp:LinkButton id="btnLastPage" runat="server" CommandArgument="Last">最后一页</asp:LinkButton></TD>
    
</TR>
</TABLE>

1.2 cs代码

public class Pager : System.Web.UI.UserControl
    
{
        
protected System.Web.UI.WebControls.Label lblTotal;
        
protected System.Web.UI.WebControls.Label labOf;
        
protected System.Web.UI.WebControls.TextBox txtCurrentPage;
        
protected System.Web.UI.WebControls.Button btnGo;
        
protected System.Web.UI.WebControls.LinkButton btnFirstPage;
        
protected System.Web.UI.WebControls.LinkButton btnPrevPage;
        
protected System.Web.UI.WebControls.LinkButton btnNextPage;
        
protected System.Web.UI.WebControls.LinkButton btnLastPage;
        
int size=10;//可以在web.config中配置
        public event System.EventHandler NavigationClick;

        
private void Page_Load(object sender, System.EventArgs e)
        
{    
            
this.txtCurrentPage.Attributes.Add("onkeypress","callButtonEvent();");
            
this.btnGo.Attributes.Add("onclick","check();");
            
if(!this.IsPostBack)
            
{                
                SetStyle();    
                SetEnable();
            }

        }


        
Web Form Designer generated code

        
btnGo_Click

        
SetStyle

        
SetEnable

        
Property Property
    }

2.建立DataGridPage.aspx
3.copy如下html代码

<HTML>
    
<HEAD>
        
<title>DataGridPage</title>
        
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
        
<meta content="C#" name="CODE_LANGUAGE">
        
<meta content="JavaScript" name="vs_defaultClientScript">
        
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    
</HEAD>
    
<body MS_POSITIONING="GridLayout">
        
<form id="Form1" method="post" runat="server">
            
<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 632px; POSITION: absolute; TOP: 40px"
                runat
="server"></asp:datagrid><uc1:pager id="Pager1" runat="server"></uc1:pager><asp:datalist id="DataList1" style="Z-INDEX: 102; LEFT: 264px; POSITION: absolute; TOP: 40px"
                runat
="server">
                
<ItemTemplate>
                    
<table>
                        
<tr>
                            
<td>用户ID:</td>
                            
<td><%# DataBinder.Eval(Container.DataItem, "UserID"%></td>
                            
<td>用户名:</td>
                            
<td><%# DataBinder.Eval(Container.DataItem, "UserName"%></td>
                        
</tr>
                    
</table>
                
</ItemTemplate>
            
</asp:datalist>
            
<asp:repeater id="Repeater1" runat="server">
                
<HEADERTEMPLATE>
                    
<table cellpadding="0" cellspacing="0" border="0">
                        
<tr>
                            
<td>用户ID</td>
                            
<td>用户名:</td>
                        
</tr>
                
</HEADERTEMPLATE>
                
<ITEMTEMPLATE>
                    
<tr>
                        
<td>
                            
<%# DataBinder.Eval(Container.DataItem, "UserID")%>
                        
</td>
                        
<td><%# DataBinder.Eval(Container.DataItem, "UserName"%></td>
                    
</tr>
                
</ITEMTEMPLATE>
                
<FOOTERTEMPLATE>
                    
</table>
                
</FOOTERTEMPLATE>
            
</asp:repeater></form>
    
</body>
</HTML>
4.拖入用户控件Pager.ascx
5.copy如下cs代码
public class DataGridPage : System.Web.UI.Page
    
{
        
protected System.Web.UI.WebControls.DataGrid DataGrid1;
        
protected UserControl.Pager Pager1;//定义用户控件,根据用户控件所在目录做适当的调整
        protected System.Web.UI.WebControls.DataList DataList1;
        
protected System.Web.UI.WebControls.Repeater Repeater1;
        
public static string ConnectionString=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
        
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
if (!this.IsPostBack)
            
{                
                BindData();
            }

        }

        
        
Bind Data        
    
        
ExecSPDataSet

        
GetList    

        
property

        
Web Form Designer generated code

        
private void Pager1_NavigationClick(object sender, EventArgs e)
        
{
            BindData();
        }

    }
6.测试表结构
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestGrid]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
drop table [dbo].[TestGrid]
GO

CREATE TABLE [dbo].[TestGrid] (
    
[UserID] [int] NOT NULL ,
    
[UserName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    
[State] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    
[Enabled] [bit] NULL 
ON [PRIMARY]
GO
7.测试存储过程
create PROCEDURE tp_Fetch_List(  
  
@page_num                INT,
  
@row_in_page             INT,
  
@order_column            VARCHAR(50),
  
@row_total               INT  OUTPUT,
  
@comb_condition          VARCHAR(500)
)
AS
BEGIN
    
SET NOCOUNT ON

    
DECLARE 
      
@jcc_status             INT,
      
@sql                  NVARCHAR(4000),
      
@row_ahead        INT
     
  
SET @jcc_status = 0

  
SET @row_ahead = (@page_num-1* @row_in_page


SET @sql='SELECT TOP '+ cast(@row_in_page as varchar(255)) +  ' * FROM ( '
SET @sql = @sql + 'SELECT   *

FROM TestGrid 
 ) as A where 1=1
'

IF LEN(@comb_condition)>0
        
SET @sql = @sql + ' AND (' + @comb_condition  + ')'    

SET @sql = @sql + 'and UserID not in ( select UserID from ('
SET @sql = @sql + 'SELECT TOP ' + cast(@row_ahead as varchar(255)) + ' * From ('
SET @sql = @sql + 'SELECT   *

FROM TestGrid 
 ) as A where 1=1
'
    
IF LEN(@comb_condition)>0
        
SET @sql = @sql + ' AND ( ' + @comb_condition  + ' )'    

    
IF LEN(@order_column)>0
        
BEGIN
            
SET @sql = @sql + ' ORDER BY ' + @order_column    + ' ) AS B )'
        
END
    
ELSE
        
BEGIN
            
SET @sql = @sql + ' ) AS B )'
        
END

    
IF LEN(@order_column)>0
        
BEGIN
            
SET @sql = @sql + ' ORDER BY ' + @order_column     
        
END

 
print @sql

    
EXEC (@sql)

    
SET @sql= N'SELECT @row_total=COUNT(*) FROM ('
SET @sql = @sql + 'SELECT  *

FROM TestGrid 
 ) as A where 1=1
'
IF LEN(@comb_condition)>0
        
SET @sql = @sql + ' AND (' + @comb_condition  + ')'    

print @sql

    
EXEC sp_executesql @sql,N'@row_total INT OUT',@row_total OUT

    
IF @@ERROR != 0
    
BEGIN
        
SELECT @jcc_status = -98
    
END


exit_bk:

-- exit with MS SQL Server error
  IF @jcc_status = -98
    
BEGIN
      
RAISERROR ('MS SQL Server error, please contact your system administrator.',16,1)WITH NOWAIT
      
RETURN (@jcc_status)
    
END

-- normal exit 
  RETURN (0)
END

GO

-- declare @aa int 
--
 exec tp_Fetch_List 1,10,'',@aa out ,'1=1'
--
 select @aa
8.源代码下载/Files/singlepine/DataGridPage.rar
posted on 2005-11-21 16:01 小山 阅读(1671) 评论(11)  编辑 收藏 收藏至365Key 所属分类: DataGrid

Feedback

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-06 09:52 hoking
如果DataGrid、DataList、Repeator嵌套的时候,怎样实现分页?

一、如果是根据最外面的数据进行分页,那有时候因为第二层或者第三层数据可能比较多,分出来的数据多,可能不太美观;也有可能出现一页数据多一页数据少的情况。

二、如果是根据里层的数据进行分页,则有可能出现这样的情况
|CCC
|DDD
|EEE
看不到里层数据CCC和外层数据的联系了。这个时候,如何实现
KKK |CCC
|DDD
|EEE
这样的效果?

  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-12 17:02 jxjjljf
編譯器錯誤訊息: CS0246: 找不到型別或命名空間名稱 'Pager' (您是否遺漏 using 指示詞或組件參考?)

protected Pager Pager1;

我明明声明了啊   回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-12 17:52 小山
先拖拉进去,然后申明就可以了,和正常的用户控件是一样的用法  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-13 08:38 jxjjljf
protected Pager Pager1;
你的文件里不也就是这么一句嘛,然后就是pager.ascx等文件嘛,我都有加哦  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-13 09:18 小山
protected UserControl.Pager Pager1;//定义用户控件,根据用户控件所在目录做适当的调整,我的Pager1是在UserControl目录下的,你的目录位置要对应上才可以  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-14 11:40 小山
我贴出来的代码是我在大的测试工程中的代码,而我放上去供下载的代码是从中独立出来,测试通过后放上去的一个小模块的,所以后不一样。
你直接运行下载后的代码就可以了  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-14 16:39 jxjjljf
我把你下载的代码弄到我的页面里面去后怎么老出错:
編譯器錯誤訊息: CS0246: 找不到型別或命名空間名稱 'Pager' (您是否遺漏 using 指示詞或組件參考?)
protected Pager Pager1;
可我明明声明了啊   回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-14 20:49 aa
山歌的代码我用了是可以的,那个Pager1是你自己定义的,就把它拉里面,然后定义就ok了,我就是按山歌说的做的呀,我的都可以正常运行  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-16 12:40 py
存储过程里面用了not in ...这个很糟糕,会产生笛卡尔积比较.
我觉得还是把原来的desc倒过来然后再top 然后再把顺序换过来效率高一些,不过那样的话是否最后一页的话需要做一个判定,否则显示的时候有问题.  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-16 12:59 小山
这个存储过程是不怎么地,我打算过阵子优化  回复
  

# re: 通用分页控件(DataGrid,DataList,Repeater都可以用它来分页) 2006-01-24 11:11 ps
你好,我按照你的代码用vb写了一遍,但现在出了个问题:我点击下一页的时候,并没有像下一页分页,仍然是当前第一页,我该怎么处理?
  回复
  
posted on 2006-03-10 10:24  S孤单一吻S  阅读(592)  评论(1)    收藏  举报