Вопрос

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

Это было полезно?

Решение

Если ваши вычисления можно воспроизвести в 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

Другие советы

Одним из решений является создание некоторого 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".

Надеюсь, это имеет смысл и поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top