zoukankan      html  css  js  c++  java
  • 利用Ajax实现DataGrid无刷新分页

    DataGrid功能强大,我们只用写几行代码就能够实现复杂的页面数据显示。数据多的时候免不了要分页显示,DataGrdi本身自带分页功能,但是当数据量少的时候很方便,当大数据量时,DataGrid得分页机制就不太好了。于是在网上找到了一种比较好的利用存储过程实现分页机制(客户端想要第几页就取第几页数据,上十万级的数据查询也很快,数据量再多的时候就没试过了,等有时间把利用存储过程分页也写在blog上)在工作中为了让客户用的更舒服点,也赶时髦,想利用Ajax来实现DataGrid无刷新分页。主要用RenderControl方法把DataGrid翻译成Html代码,然后用Web Service 返回。当然也可以用别的方法。
    GenericAjaxWS.asmx.cs
      1//GenericAjaxWS.asmx.cs
      2using System;
      3using System.Collections;
      4using System.ComponentModel;
      5using System.Data;
      6using System.Data.SqlClient;
      7using System.Diagnostics;
      8using System.Web;
      9using System.Web.Services;
     10using System.Configuration;
     11using System.Web.UI.WebControls;
     12using System.Web.UI;
     13using System.IO;
     14namespace GenricAjaxWS
     15{
     16      [WebService(Namespace="http://localhost/GenricAjaxWS/")]
     17      public class GenricAjaxWS : System.Web.Services.WebService
     18      {
     19            SqlCon nec tion con;
     20            SqlDataAdapter da;
     21            SqlCommand cmd;
     22            DataSet ds;
     23            public GenricAjaxWS()
     24            {
     25              InitializeComponent();
     26              con= new SqlConnection(ConfigurationSettings.AppSettings["Connect"]);
     27              da=new SqlDataAdapter("",con);
     28              cmd=new SqlCommand("",con);
     29              ds=new DataSet("TahaSchema");
     30            }

     31            Component Designer generated code
     54 
     55/// <summary>
     56/// this function accepts TSql statment and returns dataset
     57/// </summary>

     58 
     59            [WebMethod]
     60            public string getGrid(string sqlStr,int pageIndex)
     61            {
     62              da.SelectCommand.CommandText=sqlStr;
     63              da=new SqlDataAdapter(sqlStr,con);
     64              da.Fill(ds,"myTable");
     65              DataGrid dataGrid = new DataGrid();
     66              dataGrid.AutoGenerateColumns = true;
     67              dataGrid.DataSource = ds.Tables["myTable"].DefaultView;
     68              dataGrid.AllowPaging = true;
     69              dataGrid.PageSize = 4;
     70              dataGrid.PagerStyle.Visible = false;
     71              dataGrid.CurrentPageIndex = pageIndex;
     72              try
     73              {
     74                    dataGrid.DataBind();
     75              }

     76              catch(Exception)
     77              {
     78              }

     79              StringWriter wr = new StringWriter();
     80              HtmlTextWriter writer = new HtmlTextWriter(wr);
     81              dataGrid.RenderControl(writer);
     82              string gridHtml = wr.ToString();
     83              wr.Close();
     84              writer.Close();
     85              DropDownList ddl_Pager = new DropDownList();
     86              ddl_Pager.Attributes.Add("onchange","goToPage(this.value)");
     87              string pager="";
     88              for(int i=0;i<dataGrid.PageCount;i++)
     89              {
     90                ListItem lItem = new ListItem(i.ToString(),i.ToString());
     91                ddl_Pager.Items.Add(lItem);
     92                if(i==pageIndex)
     93                {
     94                  pager += "[background-color:#ffdd11;width" + 
     95                         ":20px;align:center\"><a href=\"#\" + 
     96                         "=\"goToPage('"+i+"')\">"+i+"</a>]";
     97                }

     98                else
     99                {
    100                  pager += "[20px;align:center\">" + 
    101                         "<a href=\"#\" + 
    102                         "('"+i+"')\" >"+i+"</a>]";
    103                }

    104              }

    105              ddl_Pager.SelectedIndex = pageIndex;
    106              wr = new StringWriter();
    107              writer = new HtmlTextWriter(wr);
    108              ddl_Pager.RenderControl(writer);
    109              string pagerHtml = "<input type='button'" + 
    110                                 " value='<' onclick='goToPrevPage()'>";
    111              pagerHtml += wr.ToString();
    112              pagerHtml += "<input type='button' value='>'" + 
    113                           " onclick='this.disabled=goToNextPage()'>";
    114              wr.Close();
    115              writer.Close();
    116              return pager+pagerHtml+"<br>"+gridHtml;
    117            }

    118      }

    119}

    120
    上面的是Web服务,然后利用Ajax请求这个服务来获取要现实的数据。以下是客户端JavaScript代码:
    AjaxFuncs.js
     1//声明异步请求对象
     2/////////////////////////////////////////////////////////////////
     3var xmlhttp;
     4/////////////////////////////////////////////////////////////////
     5//填充DataGrid,这个函数有3个参数。
     6//第一个是包含DataGrid的DIV的ID
     7//第二个是查询数据的sql语句
     8//第三个是要获取第几页数据
     9
    10/////////////////////////////////////////////////////////////////
    11var ph;
    12var fil lG rid_Str_SQL="";
    13var currentPageIndex ;
    14function fil lG rid(myPH,str_Sql,pageIndex){
    15      ph = window.document.getElementById(myPH);
    16      fillGrid_Str_SQL = str_Sql;
    17      currentPageIndex = pageIndex;
    18      var url = "http://localhost/GenricAjaxWS/GenricAjaxWS" + 
    19                ".asmx/getGrid?sqlStr="+str_Sql+
    20                "&pageIndex="+pageIndex;
    21      if(window.XMLHttpRequest)
    22    {
    23        xmlhttp=new XMLHttpRequest();
    24        xmlhttp.onreadystatechange=fillGrid_Change;
    25        xmlhttp.open("GET",url,true);
    26        xmlhttp.send(null);
    27    }

    28    //code for IE
    29    else if (window.ActiveXObject)
    30        {
    31        try
    32            {
    33            xmlhttp= new ActiveXObject("Msxml2.XMLHTTP");
    34            }

    35        catch(e)
    36            {
    37            try
    38            {
    39                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    40            }

    41            catch(e){}
    42        }

    43        if(xmlhttp)
    44        {
    45            try
    46            {
    47            xmlhttp.onreadystatechange=fil lG rid_Change;
    48            xmlhttp.open("GET",url,false);
    49            xmlhttp.send();
    50            }

    51            catch(e){}
    52        }

    53    }
     
    54}

    55
    56function fillGrid_Change()
    57{
    58      if(xmlhttp.readyState==4&&xmlhttp.status==200)
    59      {
    60          //var rows=xmlhttp.respon seX ML.
    61          //        selectNodes(".//TahaSchema//TahaTable");
    62          var row =   xmlhttp.responseXML.selectNodes(".//");
    63          ph.innerHTML = row[1].text;
    64      }

    65}

    66function goToPage(pageIndex){
    67      fil lG rid(ph.id,fillGrid_Str_SQL,pageIndex)
    68}

    69 
    70function goToNextPage(){
    71      try{  
    72            fillGrid(ph.id,fillGrid_Str_SQL, 
    73                     parseInt(currentPageIndex)+1);
    74            return false;
    75      }

    76      catch(e){
    77            return true;
    78      }

    79}

    80function goToPrevPage(){
    81      fil lG rid(ph.id,fillGrid_Str_SQL,
    82               parseInt(currentPageIndex)-1)
    83}
    最后就是显示数据的html页面,实例代码如下:
    AjaxGrid.html:
     1
     2<html>
     3  <head>
     4    <title>AjaxGrid</title>
     5  <script language="javascript" 
     6        type="text/javascript" src="ajaxFuncs.js"></script>
     7  </head>
     8  <body  onload="fil lG rid('myPH','select * from sales',1)">
     9            
    10    <form id="Form1" method="post" runat="server">
    11                        <div id="myPH" ></div>
    12     </form>
    13  </body>
    14</html>
  • 相关阅读:
    [QML] Connections元素介绍
    Common Lisp语言快速入门
    DataGrid模板列取值问题
    DataGrid 中使用 复选框(CheckBox) 删除纪录
    SQL SELECT INTO
    SQL中Case的使用方法(上篇)
    SQL中Case的使用方法(下篇)
    C# ArrayList的用法
    关于 <customErrors> 标记的“mode”属性设置为“Off”的问题的解决方案
    SQL SERVER 中identity
  • 原文地址:https://www.cnblogs.com/ilovexiao/p/950245.html
Copyright © 2011-2022 走看看