Подведение итогов GridView в ASP.NET

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 378
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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