在我的一个ASP.NET Web应用程序中,我使用BulkEditGridView(一个允许同时编辑所有行的GridView)来实现订单。在我的网格中,我有一个列,用于计算每个项目的总计(成本x数量)和页面底部的总计字段。但是,目前这些字段仅在每个回发时刷新。我需要动态更新这些字段,以便在用户更改数量时,总计和总计更新以反映新值。我曾尝试使用AJAX解决方案来完成此任务,但异步回发会干扰页面上的焦点。我认为存在纯粹的客户端解决方案,我希望社区中的某个人可以共享。
答案 0 :(得分:3)
如果您的计算可以在JavaScript中重现,最简单的方法是使用jQuery来获取所有这些项目:
$("#myGridView input[type='text']").each(function(){
this.change(function(){
updateTotal(this.value);
});
});
或者,如果您的计算过于复杂而无法在JavaScript中完成(或时间限制阻止它),那么对Web服务的AJAX调用是最好的方法。让我们说我们的网络服务是这样的:
[WebMethod, ScriptMethod]
public int UpdateTotal(int currTotal, int changedValue){
// do stuff, then return
}
你需要一些JavaScript来调用webservice,你可以用jQuery或MS AJAX来实现。我将展示两者的组合,只是为了好玩:
$("#myGridView input[type='text']").each(function(){
this.change(function(){
Sys.Net.WebServiceProxy.invoke(
"/Helpers.asmx",
"UpdateTotal",
false,
{ currTotal: $get('totalField').innerHTML, changedValue: this.value },
showNewTotal
);
});
});
function showNewTotal(res){
$get('totalField').innerHTML = res;
}
查看此链接以获取有关Sys.Net.WebServiceProxy.invoke方法的完整信息:http://www.asp.net/AJAX/Documentation/Live/ClientReference/Sys.Net/WebServiceProxyClass/WebServiceProxyInvokeMethod.aspx
答案 1 :(得分:1)
一种解决方案是在RowDataBound方法中构建一些javascript,以便在文本框发生变化时不断更新这些总数。
因此在RowDataBound期间,开始在内存中构建一个javascript字符串,它将添加您需要添加的文本框。 RowDataBound的好处是你可以通过调用TextBox.ClientId来获取这些文本框的客户端ID。 将此javascript添加到页面,然后还将onkeyup事件添加到调用此脚本所需的每个文本框中。
所以类似(这是来自gridview的行绑定事件)
private string _jscript;
protected void gridview_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//Get your textbox
Textbox tb = e.Row.FindControl("tbAddUp");
//Add the event that you're going to call to this textbox's attributes
tb.Attributes.Add("onkeyup", "MyAddUpJavaScriptMethod();");
//Build the javascript for the MyAddUpJavaScriptMethod
jscript += "document.getElementById('" + tb.ClientId + '").value + ";
}
}
然后,一旦构建了整个脚本,就可以使用Page.ClientScript类向您的页面添加一个方法,该方法将由您的文本框中的onkeyup调用“MyAddUpJavaScriptMethod”
希望有意义并有所帮助