[转]Oracle分页之三:利用PagerView来实现无刷新GridView

本文转自:http://www.cnblogs.com/scy251147/archive/2011/04/16/2018355.html

接上面一节,上面还存在问题就是分页控件使用的仍然是服务器端控件,没点一次就要刷新页面一次,也就是向服务器端请求一次。那么用什么方法能够让页面无刷新而进行分页呢?

在这里,我想到了PagerView这套开源控件,有兴趣的朋友可以通过PagerView关键字去搜搜,然后研究下,这个封装的还是挺好的。

                但是,这里遇到一个问题,如何让页面的GridView实现无刷新加载数据呢?这里我不得不提到我以前文章中写道的ICallbackEventhandler接口,这是微软的一个ajax回调接口,然后再配合这输出页面HTML的方式,不就可以实现无刷新GridView分页了吗?

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PagerWithPagerView.aspx.cs" Inherits="PagerWithPagerView" %>


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="tableview/scripts/jquery.js" type="text/javascript"></script>
    <script src="tableview/scripts/PagerView.js" type="text/javascript"></script>
    <link href="tableview/style.css" rel="stylesheet" type="text/css" />
    <link href="css/TableZB.css" rel="stylesheet" type="text/css" />
    <link href="css/swcss.css" rel="stylesheet" type="text/css" />
    <link href="css/GridViewCSS_O.css" rel="stylesheet" type="text/css" />
   <%--<style type="text/css">
   
    .PagerView a
    {
        background:url(images/loginButton.gif) no-repeat;
        
    }
   
   </style>--%>
   
</head>
<body>
   <form id="form1" runat="server">
   <div id="myData">
       <asp:GridView CssClass="GVtable" ID="GridView1" runat="server" Width="100%" 
        AutoGenerateColumns="False">
        <Columns>
        <asp:TemplateField HeaderText="编号">
        <ItemTemplate>
        <%#Eval("R").ToString() %></ItemTemplate></asp:TemplateField>
        <asp:TemplateField HeaderText="纳税人识别码">
        <ItemTemplate><%#Eval("nsrsbm").ToString() %></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="纳税人名称">
        <ItemTemplate><%#Eval("nsr_mc") %></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="登记类型">
        <ItemTemplate><%#Eval("djlx_mc")%></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="登记状态">
        <ItemTemplate><%#Eval("dj_ztmc")%></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="注册类型">
        <ItemTemplate><%#Eval("zclx_mc")%></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="所别">
        <ItemTemplate><%#Eval("gljg_mc")%></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="专管员">
        <ItemTemplate><%#Eval("zgy_mc")%></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="所属性">
        <ItemTemplate><%#Eval("ssx_mc")%></ItemTemplate></asp:TemplateField>
         <asp:TemplateField HeaderText="操作">
        <ItemTemplate>
            <asp:LinkButton ID="lbtnOperation" CommandArgument='<%#Eval("nsrsbm") %>' runat="server">编辑</asp:LinkButton>
        </ItemTemplate>
        </asp:TemplateField>
        </Columns>
    </asp:GridView>
    </div>
   <script type="text/javascript">
    window.onload=function(){
         var pager = new PagerView('pager');  //pager对象申明
         pager.itemCount = <%=totalCount %>;  //设置当前显示的页索引
         pager.size = <%=_pageSize %>;  //设置每页显示条数
         pager.onclick = function(index) {
             raiseCallBack(index,"");  //当分页按钮被点击的时候,触发的Ajax回调函数
         };
         pager.render();
     }
     
     //ajax回调成功后,进行处理的函数
     function rServer(arg,context)  
     {
        $("#myData").text();
        $("#myData").html(arg);
     }
     
     //ajax回调函数,用户向后台请求数据
     function raiseCallBack(arg,context)
     {
        <%=ClientScript.GetCallbackEventReference(this,"arg","rServer","context") %>; 
     }
</script>
    </form>
     <div id="pager"></div>
</body>
</html>

 

那么在后台只要先实现ICallbackEventhandler接口,然后获取从前台传送过来的数据,进行处理,最后将html标签元素打到前台即可。

后台代码如下:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class PagerWithPagerView : System.Web.UI.Page,ICallbackEventHandler
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Bind();
        }
    }

    public static int _pageSize = 11;
    public static int _startSize = 1;
    public static int totalCount;

    public string _str;

    //绑定gridview  并将绑定后的gridview对象返回
    private GridView Bind()   
    {
        string sqlQuery = "select nsrsbm,nsr_mc,djlx_mc,dj_ztmc,zclx_mc,gljg_mc,zgy_mc,ssx_mc from scott.t_yhs_djxxtz";
        DataSet ds = Pagination.PaginationPager(sqlQuery, _pageSize, _startSize, out   totalCount);
        GridView1.DataSource = ds.Tables["Table"];
        GridView1.DataBind();
        return GridView1;
    }


    public string GetCallbackResult()
    {
        return _str;  //将html返回到前台
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        if (!string.IsNullOrEmpty(eventArgument))
        {
            _startSize = Int32.Parse(eventArgument);
            Response.ClearContent();  //清除
            GridView gv=Bind(); //得到GridView对象
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            System.IO.StringWriter sw = new System.IO.StringWriter(sb);
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            Header.RenderControl(htw);  
            gv.RenderControl(htw);  //将生成的html元素render出来
            _str = sb.ToString();  
        }
    }

}

代码中已经有了注释,我这里不再详细说明,这里只要知道ICallbackEventhandler接口的使用方法即可。

 

原文地址:https://www.cnblogs.com/freeliver54/p/5169384.html