A1ASPNETGridview控件高效异步更新与实验转.docx

上传人:b****8 文档编号:9463117 上传时间:2023-05-19 格式:DOCX 页数:33 大小:25.19KB
下载 相关 举报
A1ASPNETGridview控件高效异步更新与实验转.docx_第1页
第1页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第2页
第2页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第3页
第3页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第4页
第4页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第5页
第5页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第6页
第6页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第7页
第7页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第8页
第8页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第9页
第9页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第10页
第10页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第11页
第11页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第12页
第12页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第13页
第13页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第14页
第14页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第15页
第15页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第16页
第16页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第17页
第17页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第18页
第18页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第19页
第19页 / 共33页
A1ASPNETGridview控件高效异步更新与实验转.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

A1ASPNETGridview控件高效异步更新与实验转.docx

《A1ASPNETGridview控件高效异步更新与实验转.docx》由会员分享,可在线阅读,更多相关《A1ASPNETGridview控件高效异步更新与实验转.docx(33页珍藏版)》请在冰点文库上搜索。

A1ASPNETGridview控件高效异步更新与实验转.docx

A1ASPNETGridview控件高效异步更新与实验转

【上篇】

本文详细描述了如何使用.net的ICallbackEventHandler接口开发包括排序(sorting),分页显示(paging),改变页长(pagelengthchange)AJAXGridview控件,我在下面会介绍到具体编程,读者也可以在文章最后下载到所有的源码。

本例开发的Gridview控件的基本功能如下(所有操作都是异步的):

点击列名旁边的箭头升序或者降序排列数据

翻页

改变每页显示的数目

在本例中,我们将会用到一个ASP.NET中最为强大的特性-RenderControl。

该方法能使我们方便地(在服务器端-译者注)通过HtmlTextWriter和StirngWriter对象访问到一个控件的HTML代码。

示例:

using(StringWritersw=newStringWriter())

...{

HtmlTextWriterhtw=newHtmlTextWriter(sw);

_grid.RenderControl(htw);

htw.Flush();

stringresult=sw.ToString();

}我们获取到grid控件的html格式的代码并赋给一个string变量-这个工作是在绑定控件数据源之后做的。

现在,我们从开发UI代码开始一步一步完成这个示例程序:

首先,在网页的标签内写下如下代码,创建一个Gridview和Dropdownlist控件:

GridViewEnableViewState="false"runat="server"id="_grid"OnRowDataBound="_grid_RowDataBound"AllowPaging="True">

GridView>


Changepagelengthto--

DropDownListID="ddl"runat="server">

DropDownList>注意Gridview控件的RowDataBound事件已经激活了。

下一步,我们来创建一个DataTable,作为Gridview控件的数据源:

publicDataTable_sampleData

...{

get...{

DataTabledt=(DataTable)ViewState["DataTable"];

if(dt==null)

...{

dt=newDataTable();

dt.Columns.Add(newDataColumn("ContactName",typeof(string)));

dt.Columns.Add(newDataColumn("CompanyName",typeof(string)));

dt.Columns.Add(newDataColumn("City",typeof(string)));

dt.Columns.Add(newDataColumn("Country",typeof(string)));

dt.Rows.Add(newobject[]...{"MariaAnders","AlfredsFutterkiste","Berlin","Germany"});

dt.Rows.Add(newobject[]...{"AnaTrujillo","Emparedadosyhelados","MéxicoD.F.","Mexico"});

dt.Rows.Add(newobject[]...{"AntonioMoreno","AntonioMorenoTaquería","MéxicoD.F.","Mexico"});

ViewState["DataTable"]=dt;

}

returndt;

}我们使用ViewState而不是Session变量来存放DataTable.

比如,ViewState["DataTable"]=dt;

用session可以缓存整个网站的变量,ViewState就只存某个页面的。

在绑定数据的时候,我们只需要写_grid.DataSource=_sampleData即可。

下面是Gridview的4个操作方法:

排序

privatevoidsortGrid(stringArgument,stringpageLength)

...{

DataViewdv=_sampleData.DefaultView;

result="";

dv.Sort=Argument;

_grid.DataSource=dv;

_grid.PageSize=Convert.ToInt16(pageLength);

_grid.DataBind();

renderGrid(_grid);

}

翻页

privatevoidchangePage(stringArgument,stringpageLength)

...{

result="";

_grid.DataSource=_sampleData;

_grid.PageSize=Convert.ToInt16(pageLength);

_grid.PageIndex=Convert.ToInt16(Argument);

_grid.DataBind();

renderGrid(_grid);

}

改变每页显示长度

privatevoidchangePageLength(stringArgument,stringpageLength)

...{

result="";

_grid.DataSource=_sampleData;

_grid.PageSize=Convert.ToInt16(Argument);

_grid.DataBind();

renderGrid(_grid);

//pageLengthisnotused

}

刷新Gridview

privatevoidrenderGrid(GridView_grid)

...{

using(StringWritersw=newStringWriter())

...{

HtmlTextWriterhtw=newHtmlTextWriter(sw);

_grid.RenderControl(htw);

htw.Flush();

result=sw.ToString();

}

}上述4个方法的名称显示了其实现的功能,而前三个的第二个参数'pageLength'是dropdownlist控件选定的值。

我们需要另外4个方法来实现ICallbackEventHandler异步回调-两个是javascript方法(其一对服务器端回调,其二用来接收服务器端返回的值并做异步刷新),两个是服务器端的方法(RaiseCallbackEvent和GetCallbackResult,译者注:

ICallbackEventHandler的两个接口方法,前面的用来响应客户端回调,后面的用来返回操作结果)。

JavaScript方法如下:

functionUpdateGrid(args)

...{

args=args+"$"+window.document.getElementById('ddl').value;

<%=ClientScript.GetCallbackEventReference(this,"args","ShowResult",null)%>

}在页面装载完成之后,我们将在页面的源代码里面看到上面的代码编程了这个样子:

functionUpdateGrid(args)

...{

args=args+"$"+window.document.getElementById('ddl').value;

WebForm_DoCallback('__Page',args,ShowResult,null,null,false);

}

在回调的时候,我们会触发服务器端的一个事件,因此,UpdateGrid(args)方法需要放在标签之内,否则的话会发生一个JavaScript错误。

我们通过Page.ClientScript.RegisterClientScriptBlock方法来注册这个JavaScipt方法,这样的话它将仅出现在标签之内。

functionShowResult(eventArgument,context)

...{

window.document.getElementById('Gridview').innerHTML=eventArgument;

}这个方法将在服务器端响应客户端之后触发,它负责处理服务器端的返回值。

在这里我们只是简单的用返回值替换掉innerHTML属性。

innerHTML包含了需要更新的Gridview的HTML代码。

服务器端的代码如下:

publicstringGetCallbackResult()

...{

returnresult;

}该方法返回在ShowResult客户端方法中设置innerHTML的结果。

publicvoidRaiseCallbackEvent(stringeventArgument)

...{

string[]args=eventArgument.Split('$');

if(args[0]=="sort")...{sortGrid(args[1],args[2]);}

elseif(args[0]=="changePage")...{changePage(args[1],args[2]);}

elseif(args[0]=="changePageLength")...{changePageLength(args[1],args[2]);}

}该函数输入参数形如"changePage$1$10"或者"sort$1$10"或者"changePageLength$1$10"或者"sort$ContactNameAsc"或者“sort$ContactNameDesc$10”,我们用字符串解析函数得到下列参数列表:

操作名称(Action);

Gridview控件的页码(PageIndexoftheGridview);

Dropdownlist的每页显示长度(Pagesizefromthedropdownlist)

在RaiseCallbackEvent方法中我们调用了一些处理具体操作的函数,每个函数都会设置Gridview更新之后的HTML代码给返回参数。

页面装载代码:

if(!

IsPostBack)

...{

_grid.DataSource=_sampleData;

_grid.DataBind();

ddl.Items.Add("10");

ddl.Items.Add("20");

ddl.Items.Add("30");

ddl.Attributes.Add("onchange","javascript:

UpdateGrid('changePageLength$'+this.value);");

}这里设置Gridview控件每页的显示长度。

现在实现Gridview的RowDataBound事件,为了列排序功能,修改了Gridview控件的列头:

if(e.Row.RowType==DataControlRowType.Header)

...{

for(inti=0;i

...{

e.Row.Cells[i].Text=string.Format("{0}",e.Row.Cells[i].Text);

}

}

列头上加上了上下箭头,点击他们的时候将调用UpdateGrid方法(在客户端-译者注)回调服务器端的升序和降序排列方法。

随后我们对页码行(PageRow)做一些绑定时的修改,使页码能够在点击的时候调用UpdateGrid方法。

elseif(e.Row.RowType==DataControlRowType.Pager)

...{

GridViewgdv=(GridView)sender;

int_pageCount=gdv.PageCount;

e.Row.Cells[0].Text="";

for(inti=0;i<_pageCount;i++)

...{

HyperLinkhyp=newHyperLink();

hyp.Text=i.ToString()+" ";

hyp.Attributes.Add("href","javascript:

UpdateGrid('changePage$"+i+"');");

e.Row.Cells[0].Controls.Add(hyp);

Labell=newLabel();

l.Text=" ";

e.Row.Cells[0].Controls.Add(l);

hyp=null;

}

}

_pageCount用来保存Gridview控件的页数,为了显示页码,我们使用了HyperLink+Label+空格的方式。

最后,把EnableViewState属性设置为false,用来减轻页面的负担。

【下篇】

上篇我们使用了ICallbackEventHandler接口实现了一个AJAX的Gridview控件,功能如下:

点击列名旁边的上下小箭头实现升序和降序排列的功能

翻页

改变每页显示长度

本篇将讨论如何通过双击数据格(gridcell)来修改格子里的数据,实现服务器端数据更新的时候来异步刷新页面的功能。

关键点如下:

在PageLoad的时候只绑定一次数据到Gridview控件

只有当更新数据要求传到服务器端的时候才更新Gridview控件

UI代码:

GridViewEnableViewState="false"runat="server"id="_grid"OnRowDataBound="_grid_RowDataBound">

GridView>


JSUpdateTable();"/>

...

functionUpdateGrid(args)

...{

<%=ClientScript.GetCallbackEventReference(this,"args","ShowResult",null)%>;

}

使用一个DataTable作为数据源:

publicDataTable_sampleData

...{

get

...{

DataTabledt=(DataTable)Session["DataTable"];

if(dt==null)

...{

dt=newDataTable();

dt.Columns.Add(newDataColumn("ContactName",typeof(string)));

dt.Columns.Add(newDataColumn("CompanyName",typeof(string)));

dt.Columns.Add(newDataColumn("City",typeof(string)));

dt.Columns.Add(newDataColumn("Country",typeof(string)));

dt.Rows.Add(newobject[]...{"MariaAnders","AlfredsFutterkiste","Berlin","Germany"});

dt.Rows.Add(newobject[]...{"AnaTrujillo","Emparedadosyhelados","MéxicoD.F.","Mexico"});

dt.Rows.Add(newobject[]...{"AntonioMoreno","AntonioMorenoTaquería","MéxicoD.F.","Mexico"});

Session["DataTable"]=dt;

}

returndt;

}

set

...{

Session["DataTable"]=value;

}

}注意:

在这里我们使用Session而不是ViewState存放DataTable变量,因为我们需要在服务器端更新数据,如果使用ViewState的话需要对页面进行回发(postback)才行。

使用下面的代码把Datatable绑定到Gridview控件:

_grid.DataSource=_sampleData;更新的时候:

_sampleData=_tempTable,_tempTable是更新了数据之后的临时DataTable变量。

页面类继承ICallbackEventHandler接口:

publicpartialclassDefault:

System.Web.UI.Page,ICallbackEventHandler

添加RaiseCallbackEvent方法和GetCallbackResult方法:

publicvoidRaiseCallbackEvent(stringeventArgument)

...{

string[]args=eventArgument.Split('$');

if(args[0]=="updateTable")updateTable(args[1]);

}

publicstringGetCallbackResult()

...{

returnresult;

}result是定义在整个页面上的全局变量。

为了让数据格(cell)能够响应双击事件变成textbox或者dropdownlist,我们把Gridview和dataTable都看做一个二维数组,里面的任何数据格都同列、行相关联起来(如同row[i][j]),每一个数据格都有一个唯一的id值同DataTable里面的数据对应起来。

RowDataBound事件实现:

protectedvoid_grid_RowDataBound(objectsender,GridViewRowEventArgse)

...{

if(e.Row.RowType==DataControlRowType.DataRow)

...{

for(inti=0;i

...{

e.Row.Cells[i].Attributes.Add("ondblclick","javascript:

MakeCellEditable(this);");

e.Row.Cells[i].Attributes.Add("id",_rowNumber+"_"+i);

}

_rowNumber+=1;

}

}这里规定的每个数据格的id是_rowNumber+"_"+i,这样就同row[i][j]结构对应起来了,定位数据格的时候我们可以用解析函数解析id,从而或得[i]和[j]的值。

JavaScript方法MakeCellEditable:

functionMakeCellEditable(obj)

...{

if(!

window.document.getElementById(obj.id+"_input"))

...{

obj.innerHTML=""

}

window.document.getElementById(obj.id+"_input").focus();

}

接下来是得到所有的客户端已经修改的值并把他们用异步回调的方法送到服务器端去更新DataTable,Update按钮的onclick方法如下:

functionJSUpdateTable()

...{

varddl=window.document.getElementById('Gridview');

varddl1=ddl.getElementsByTagName('input');

vardata="";

for(i=0;i

...{

ddlId[i]=ddl1[i].id;//ddlIdisaglobalarrayinJSwewilluseitinstep9

if(i==0)data=ddl1[i].id+"|"+ddl1[i].value;

elsedata=data+"~"+ddl1[i].id+"|"+ddl1[i].value;

}

UpdateGrid('updateTable$'+data);

}

在服务器端的RaiseCallbackEvent方法中将调用updateTable方法:

privatevoidupdateTable(string_data)

...{

string[]_NewData=_data.Split('~');

DataTable_tempTable=_sampleData;

for(inti=0;i<_NewData.Length;i++)

...{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2