利用jQuery 实现GridView异步排序、分页的代码

2016-02-19 13:55 9 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享利用jQuery 实现GridView异步排序、分页的代码的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - Web开发 】

每次请求备份管理页面时,服务端会把所以的备份还原信息都传到客户端,然后ui.tabs将两种信息折叠起来分别显示,好在ui.tabs给我提供ajax功能,我们的每个tab可以直接应用另外一个页面
如:

代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

div id="container"
ul
lia href="#fragment-1"span备份/span/a/li
lia href="Restore.aspx"span还原/span/a/li
/ul
/div


但这样,当Restore.aspx存在服务端控件时,当他与服务端交互时,将不会很理想,比如GridView自带排序,分页就不可能实现,因为每一次交互他总是他只会显示你第一次加载该tab的状态(gridview它可能总是显示的第一页),有时甚至会充开整个页面。

解决这个问题,首先想到时ajax以防止被引用的页面全部重新加载。UpdatePanel我试了一下不行,如是便想到juery。

下面我将示范如何结合jquery实现GridView的异步排序,分页。

首先我们还时在页面放放一个gridview,他不会作为页面中真正显示的部分,而是作为辅助html输出,当一个ajax请求来到时,我们利用这个GridView,Render为Html输出,ajax的回调函数完成显示。为了不显示GridView我在PreRender中设置Visible = false,不能直接设置Visible=false否则他不会被Render成html



代码

代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)
body onload="getPageData(1)"
form id="form1" runat="server"
div
div id='ShowData'
asp:GridView id="gvRestore" runat="server" Width="100%" PageSize="5" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" AllowPaging="True" OnRowDataBound="gvRestore_RowDataBound" AllowSorting="True" Height="138px" OnDataBound="gvRestore_DataBound" OnPreRender="gvRestore_PreRender" Columns
asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" Visible="False"/asp:BoundField
asp:BoundField DataField="WorkId" HeaderText="工号" SortExpression="WorkId"/asp:BoundField
asp:BoundField DataField="userName" HeaderText="操作人姓名" SortExpression="userName"/asp:BoundField
asp:BoundField DataField="operateType" HeaderText="操作类型" SortExpression="operateType"/asp:BoundField
asp:BoundField DataField="operateWay" HeaderText="操作方式" SortExpression="operateWay"/asp:BoundField
asp:BoundField DataField="operateTime" HeaderText="操作时间" SortExpression="operateTime"/asp:BoundField
asp:BoundField DataField="operatePath" HeaderText="保存路径" SortExpression="operatePath"/asp:BoundField
asp:BoundField DataField="operateReason" HeaderText="操作原因" SortExpression="operateReason"/asp:BoundField
asp:TemplateField HeaderText="选择"
ItemTemplate
input id="Radio1" type="radio" name="Restore" value='%#Eval("operatePath") %'/label for="Radio1"选择/label
/ItemTemplate
/asp:TemplateField
/Columns
/asp:GridView
/div
asp:SqlDataSource id="SqlDataSource1" runat="server" SelectCommand="SELECT * FROM [BackUpInfo] where operateType='备份'" ConnectionString="%$ ConnectionStrings:BackUpConnectionString %"
/asp:SqlDataSource
/div
/form
/body


注意,我们在Body的onload事件中指定了一个 函数,他会在页面被加载时请求服务端,传回数据。本身是个ajax请求

原形如下:

代码

代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)
var getPageData=function(i)
{
$.ajax({
url:'Restore.aspx?'+new Date()+'&page='+i,//指定pageindex
type:'get',
success:function(data,textStatus)
{
$('#ShowData')[0].innerHTML=data;
},
error:function(XMLHttpRequest,textStatus)
{
//debugger;
$('#ShowData').text(XMLHttpRequest.responseText);
},
complete:function(XMLHttpRequest,textStatus)
{
}
});

接下来就是排序了,通过get方式指定排序字段,排序方向。函数如下:
代码

代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)
var sortDataGridView=function(sortExpression,sortDirection)
{
event.returnVaule=false;//阻止提交服务器
$.ajax({
url:'Restore.aspx?'+new Date()+'&sortEx='+sortExpression+'&sortDir='+sortDirection,//IE从在缓存,因此加new Date()防止缓存的影响
type:'get',
success:function(data,textStatus)
{
$('#ShowData')[0].innerHTML=data;
},
error:function(XMLHttpRequest,textStatus)
{
$('#ShowData').text(XMLHttpRequest.responseText);
},
complete:function(XMLHttpRequest,textStatus)
{
}
});
}


当点击GridView中HeadText时我们要触发 sortDataGridView实现异步排序,查看GridView的原始生成内容,实际上是个A标记a href="javascript:__doPostBack('gvRestore','Sort$WorkId')"
我们要为该标记添加一个onclick事件,并移除href属性值,以防止PostBack服务器。因此我在GridView的RowDataBound事件做如下处理:

代码

代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)
protected void gvRestore_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
for (int i = 1; i = 7; i++)
{
LinkButton lt = (LinkButton)e.Row.Cells[i].Controls[0];
lt.Attributes["href"] = "#";
lt.OnClientClick = string.Format(" return sortDataGridView('{0}','{1}')", lt.CommandArgument, "ASC");
}
}
if (e.Row.RowType == DataControlRowType.Pager)
{
e.Row.Visible = false;
}
}


到这一步,思路基本上已经清晰,剩下的事,就是在服务端响应ajax请求了,很简单,直接看代码,要注意是调用GridView的RendControl方法,输出html。



现在可以实现gridview的ajax排序和分页 ,总结一下思路其实很简单,但在实现的时还是走了点弯路,主要时原本想同通过code形式手工实例化一个GridView,但最终还是没有实现,因为我添加了一个模板列。在模板列中添加一个intput type='Radio' 我在code时继承ITemplate,但我确不知怎样实现value='%#Eval("operatePath") %'的绑定,这里留下一个问题吧,谁知道,请告诉我。

代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)
asp:TemplateField HeaderText="选择"
ItemTemplate
input id="Radio1" type="radio" name="Restore" value='%#Eval("operatePath") %'/label for="Radio1"选择/label
/ItemTemplate
/asp:TemplateField





代码

代码如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)
static string sortDirection = "ASC";
protected void Page_Load(object sender, EventArgs e)
{
if (hasKeyName("page"))
{
if (!string.IsNullOrEmpty(Request.QueryString["page"].ToString()))
{
this.gvRestore.PageIndex = int.Parse(Request.QueryString["page"].ToString());
ResponseData(this.gvRestore);
}
}
else
if (hasKeyName("sortEx"))
{
string sortEx = Request.QueryString["sortEx"].ToString();
string sortDir = Request.QueryString["sortDir"].ToString();
if (string.Compare(sortDir, sortDirection, true) == 0)
{
this.gvRestore.Sort(sortEx, SortDirection.Ascending);
sortDirection = "DSAC";
}
else
{
this.gvRestore.Sort(sortEx, SortDirection.Descending);
sortDirection = "ASC";
}
ResponseData(this.gvRestore);
}
}

private bool hasKeyName(string key)
{
string[] keys = Request.QueryString.AllKeys;
foreach (string str in keys)
{
if (String.Compare(key, str, true) == 0)
return true;
}
return false;
}

private void ResponseData(GridView gv)
{
gv.DataSourceID = this.SqlDataSource1.ID;
System.Globalization.CultureInfo info = new System.Globalization.CultureInfo("ZH-CN", true);
System.IO.StringWriter sWriter = new System.IO.StringWriter(info);
System.Web.UI.HtmlTextWriter html = new HtmlTextWriter(sWriter);
gv.DataBind();
if (gv != null)
{
gv.RenderControl(html);
}
Response.Write(html.InnerWriter);
Response.Write(GetNav(gv.PageCount));
Response.Flush();
Response.End();
}

public string GetNav(int pagesize)
{
string NavStr = @"tabletr";
for (int i = 0; i pagesize; i++)
{
NavStr = NavStr + @"tda href='#' onclick='getPageData(" + (i + 1).ToString() + ")'" + (i + 1).ToString() + @" | " + @"/a/td";
}
NavStr = NavStr + @"/tr/table";
return NavStr;
}

public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}
protected void gvRestore_PreRender(object sender, EventArgs e)
{
this.gvRestore.Visible = false;
}

来源:http://www.tulaoshi.com/n/20160219/1605652.html

延伸阅读
  由于客户对速度和性能上的要求越来越变态,而数据量一天天的庞大,因此本人产生了数据的查询和分页完全由客户端回调来实现。想法看上去复杂,实现起来也不难。废话不多说,看程序吧。      一、存储过程      包头:      create or replace p...
标签: Web开发
//改變時的事件 代码如下: $("#testSelect").change(function(){ //事件發生 jQuery('option:selected', this).each(function(){ //印出選到多個值 alert(this.value); }); }); //印出選到的項目 代码如下: 法1:$("select#Clubs").children("[@selected]").each(function(){ alert(this.text); }); 法2:$("#selBags").va...
标签: Web开发
代码如下: /** * ppagination.js * p通用的基于AJAX的分页类 * @author jeanwendy * @version 1.0 */ var paginationIndex = 0; var pagination = function(trTemplatId) {     $().ajaxStart(function() {         $.blockUI({       ...
标签: Web开发
实现方法: 代码如下: !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" html xmlns="http://www.w3.org/1999/xhtml" head title浮动广告/title style type="text/css" #qqonline{ background-color:red; border:...
标签: Web开发
经过分析,网上的参考,终于搞定了~~ jQuery插件代码: 代码如下: jQuery.fn.selectItem = function(targetId) { var _seft = this; var targetId = $(targetId); this.toggle( function() { var A_top = $(this).offset().top + $(this).outerHeight(true); // 1 var A_left = $(this).offset().left; targetId.bgiframe(); targ...

经验教程

636

收藏

70
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部