В одном из моих веб-приложений ASP.NET я использую BulkEditGridView (GridView, который позволяет редактировать все строки одновременно) для реализации формы заказа. В моей сетке у меня есть столбец, в котором вычисляется общая сумма для каждого элемента (стоимость x количество) и поле общей суммы внизу страницы. Однако в настоящее время эти поля обновляются только при каждой обратной передаче. Мне нужно, чтобы эти поля обновлялись динамически, чтобы по мере изменения количества пользователей обновлялись итоги и общий итог, чтобы отражать новые значения. Я попытался использовать для этого решения AJAX, но асинхронная обратная передача мешает фокусировке на странице. Я полагаю, что существует чисто клиентское решение, и надеюсь, что кто-нибудь из сообщества поделится им.





Одним из решений является создание некоторого javascript в вашем методе RowDataBound для постоянного обновления этих итогов при изменении текстовых полей.
Итак, во время RowDataBound начните создавать строку javascript в памяти, которая добавит текстовые поля, которые вам нужно добавить. Что хорошо в RowDataBound, так это то, что вы можете получить идентификаторы на стороне клиента этих текстовых полей, вызвав TextBox.ClientId. Добавьте этот 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»
Надеюсь, что это имеет смысл и поможет
Если ваши расчеты могут быть воспроизведены в JavaScript, самым простым способом было бы использовать jQuery для получения всех таких элементов, как это:
$("#myGridView input[type='text']").each(function(){
this.change(function(){
updateTotal(this.value);
});
});
Или, если ваши расчеты слишком сложны для выполнения в JavaScript (или этому мешают ограничения по времени), то лучший способ - вызов AJAX веб-службы. Допустим, у нас есть такой веб-сервис:
[WebMethod, ScriptMethod]
public int UpdateTotal(int currTotal, int changedValue){
// do stuff, then return
}
Вам понадобится некоторый JavaScript для вызова веб-службы, вы можете сделать это либо с помощью 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