65.9K
CodeProject 正在变化。 阅读更多。
Home

DataGrid 中的客户端分页(AjaxGrid)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.15/5 (15投票s)

2005 年 9 月 12 日

2分钟阅读

viewsIcon

119695

downloadIcon

701

DataGrid 中的客户端分页。

Sample Image - AjaxGrid.gif

引言

AjaxGrid 提供了一种高效且简单的方法来实现客户端分页。它使用一个 Web 服务,该服务通过 AJAX 技术被客户端脚本调用。

这个想法源于 CodeProject 上发布的一篇文章。我阅读了它,发现客户端脚本通过解析 XML 数据集来生成 HTML 表格。

并且,它不是生成单个页面,而是生成所有页面到单独的层中,并隐藏除当前页面层之外的所有其他层。这是一种有趣的方法,但对于实现这种分页方式,不需要 AJAX,因为所有 HTML 的生成都是一次性的。客户端和服务器之间没有进一步的交互。

然后我想到,“为什么不使用 Microsoft 的 DataGrid 类来生成包含数据的 HTML 表格呢?” 既然我们有一个方便且强大的类,比如 DataGrid,为什么还要手动生成 HTML 并退回到旧技术呢?

答案是肯定的,所以我进入了下一步,即实现。哇!!!这太容易了!!相信我。我只是编写了一个 Web 服务,它通过使用 RenderControl 方法解析 DataGrid 来返回 HTML。然后我添加了一些额外的代码来实现分页。

GenericAjaxWS.asmx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Configuration;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.IO;

namespace GenricAjaxWS
{
      [WebService(Namespace="https:///GenricAjaxWS/")]
      public class GenricAjaxWS : System.Web.Services.WebService
      {
            SqlConnection con;
            SqlDataAdapter da;
            SqlCommand cmd;
            DataSet ds;

            public GenricAjaxWS()
            {
              InitializeComponent();
              con= new SqlConnection(ConfigurationSettings.AppSettings["Connect"]);
              da=new SqlDataAdapter("",con);
              cmd=new SqlCommand("",con);
              ds=new DataSet("TahaSchema");
            }

            #region Component Designer generated code

            //Required by the Web Services Designer 

            private IContainer components = null;

            /// <summary>

            /// Required method for Designer support - do not modify

            /// the contents of this method with the code editor.

            /// </summary>

            private void InitializeComponent()
            {
            }

            /// <summary>

            /// Clean up any resources being used.

            /// </summary>

            protected override void Dispose( bool disposing )
            {
              if(disposing && components != null)
              {
                    components.Dispose();
              }
              base.Dispose(disposing);
            }
            
            #endregion
 
/// <summary>

/// this function accepts TSql statment and returns dataset

/// </summary>

 

            [WebMethod]
            public string getGrid(string sqlStr,int pageIndex)
            {
              da.SelectCommand.CommandText=sqlStr;
              da=new SqlDataAdapter(sqlStr,con);
              da.Fill(ds,"myTable");

              DataGrid dataGrid = new DataGrid();
              dataGrid.AutoGenerateColumns = true;
              dataGrid.DataSource = ds.Tables["myTable"].DefaultView;
              dataGrid.AllowPaging = true;
              dataGrid.PageSize = 4;
              dataGrid.PagerStyle.Visible = false;
              dataGrid.CurrentPageIndex = pageIndex;
              try
              {
                    dataGrid.DataBind();
              }
              catch(Exception)
              {

              }
              StringWriter wr = new StringWriter();
              HtmlTextWriter writer = new HtmlTextWriter(wr);
              dataGrid.RenderControl(writer);
              string gridHtml = wr.ToString();
              wr.Close();
              writer.Close();
              DropDownList ddl_Pager = new DropDownList();
              ddl_Pager.Attributes.Add("onchange","goToPage(this.value)");
              string pager="";
              for(int i=0;i<dataGrid.PageCount;i++)
              {
                ListItem lItem = new ListItem(i.ToString(),i.ToString());
                ddl_Pager.Items.Add(lItem);
                if(i==pageIndex)
                {
                  pager += "[<span style=\"background-color:#ffdd11;width" + 
                         ":20px;align:center\"><a href=\"#\" onclick" + 
                         "=\"goToPage('"+i+"')\">"+i+"</a></span>]";
                }
                else
                {
                  pager += "[<span style=\"width:20px;align:center\">" + 
                         "<a href=\"#\" onclick=\"goToPage" + 
                         "('"+i+"')\" >"+i+"</a></span>]";
                }
              }
              ddl_Pager.SelectedIndex = pageIndex;
              wr = new StringWriter();
              writer = new HtmlTextWriter(wr);
              ddl_Pager.RenderControl(writer);
              string pagerHtml = "<input type='button'" + 
                                 " value='<' onclick='goToPrevPage()'>";
              pagerHtml += wr.ToString();
              pagerHtml += "<input type='button' value='>'" + 
                           " onclick='this.disabled=goToNextPage()'>";
              wr.Close();
              writer.Close();
              return pager+pagerHtml+"<br>"+gridHtml;
            }
      }
}

我们已经编写了 Web 服务……下一步是从客户端脚本与服务通信。这里 AJAX 可以帮助你。首先部署 Web 服务,然后创建一个名为 AjaxGridTest 的新项目。添加一个名为 AjaxFuncs.js 的 JavaScript 文件到项目中。

AjaxFuncs.js

/////////////////////////////////////////////////////////////////

//Variable Declarations

/////////////////////////////////////////////////////////////////

var xmlhttp;
/////////////////////////////////////////////////////////////////

//fillGrid

//This Function Takes three parameters

//first parameter is the id of a DIV tag to which you want 

//to populate the Grid

//Second Paramaeter is the Sql String

//Third Parameter is the selected page index

/////////////////////////////////////////////////////////////////

var ph;
var fillGrid_Str_SQL="";
var currentPageIndex ;
function fillGrid(myPH,str_Sql,pageIndex){
      ph = window.document.getElementById(myPH);
      fillGrid_Str_SQL = str_Sql;
      currentPageIndex = pageIndex;
      var url = "https:///GenricAjaxWS/GenricAjaxWS" + 
                ".asmx/getGrid?sqlStr="+str_Sql+
                "&pageIndex="+pageIndex;

      if(window.XMLHttpRequest)
    {
        xmlhttp=new XMLHttpRequest();
        xmlhttp.onreadystatechange=fillGrid_Change;
        xmlhttp.open("GET",url,true);
        xmlhttp.send(null);
    }
    //code for IE

    else if (window.ActiveXObject)
        {
        try
            {
            xmlhttp= new ActiveXObject("Msxml2.XMLHTTP");
            }
        catch(e)
            {
            try
            {
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e){}
        }

        if(xmlhttp)
        {
            try
            {
            xmlhttp.onreadystatechange=fillGrid_Change;
            xmlhttp.open("GET",url,false);
            xmlhttp.send();
            }
            catch(e){}
        }
    } 
}
/////////////////////////////////////////////////////////////

//fillGrid_Change

/////////////////////////////////////////////////////////////

function fillGrid_Change()
{
      if(xmlhttp.readyState==4&&xmlhttp.status==200)
      {
          //var rows=xmlhttp.responseXML.

          //        selectNodes(".//TahaSchema//TahaTable");

          var row =   xmlhttp.responseXML.selectNodes(".//");
          ph.innerHTML = row[1].text;
      }
}

function goToPage(pageIndex){
      fillGrid(ph.id,fillGrid_Str_SQL,pageIndex)
}
 
function goToNextPage(){
      try{  
            fillGrid(ph.id,fillGrid_Str_SQL, 
                     parseInt(currentPageIndex)+1);
            return false;
      }
      catch(e){
            return true;
      }
}

function goToPrevPage(){
      fillGrid(ph.id,fillGrid_Str_SQL,
               parseInt(currentPageIndex)-1)
}

现在,将一个名为 AjaxGrid.html 的页面添加到项目中。

AjaxGrid.html

<html>
  <head>
    <title>AjaxGrid</title>
  <script language="javascript" 
        type="text/javascript" src="ajaxFuncs.js"></script>
  </head>
  <body  onload="fillGrid('myPH','select * from sales',1)">
            
    <form id="Form1" method="post" runat="server">
                        <div id="myPH" ></div>
     </form>
  </body>
</html>

就这些了!!!

你已经成功开发了一个具有客户端分页功能的 DataGrid。希望这篇文章能帮助你学到一些东西。请就任何评论/建议与我联系。

© . All rights reserved.