Вычисляемые колонки в элементе управления V8EditGrid

При создании веб-приложений зачастую возникает задача реализации в элементе управления V8EditGrid вычисляемых колонок, содержащих итоговые значения по строке данных. Рассмотрим пример создания вычисляемой колонки в элементе управления V8EditGrid.

В качестве информационной базы данных будем использовать базу данных Демонстрационного примера Web-расширения.

Сделаем предположение, что вся номенклатура облагается НДС по ставке 18% и выведем полученную итоговую сумму в табличную часть документа "РасходнаяНакладная".

С помощью Помощника создаем в среде Visual Studio новый проект; в качестве базы данных выберем информационную базу Демонстрационного примера Web-расширения.

Далее, воспользовавшись шаблоном V8ListForm, создаем форму списка для документа "РасходнаяНакладная". Полученную форму устанавливаем как стартовую форму приложения.

Используя шаблон V8ItemForm, создаем форму элемента документа "РасходнаяНакладная". В списке полей для размещения в диалоге Помощника выбираем следующие поля:

Нажимаем кнопку "Вперед" и отмечаем для размещения в форме табличную часть "Состав" и выбираем все ее реквизиты.

В созданной форме элемент управления V8EditGrid1 типа V8EditGrid, предназначенный для редактирования табличной части "Состав", не содержит описания колонок. Вместо этого, V8EditGrid1 получает список колонок от связанного с ним источника данных (элемент ItemDataSource типа V8ObjectDataSource).

Для нашей задачи мы должны иметь описания колонок в элементе управления V8EditGrid. Для того, чтобы не заносить описания колонок вручную, мы воспользуемся командой "Fill columns": выделяем на форме элемент управления V8EditGrid1 и в его контекстном меню выбираем пункт "Fill columns". Коллекция Columns теперь содержит список колонок.

Теперь в коллекцию Columns добавим колонку "Итого", установив ей следующие свойства:

Свойство Значение свойства
ColumnName Итого
Format F2
HeaderText Итого
ReadOnly True

Для заполнения созданной нами колонки необходимо воспользоваться событием ItemDataBound элемента управления V8EditGrid1. Это событие вызывается для каждой строки списка в тот момент, когда происходит связывание V8EditGrid с данными из источника данных.

Но прежде мы должны описать функцию, которая нам позволит получать позиции колонок с учетом автонумерации и невидимости некоторых данных. Переключимся в режим редактирования codebehind-файла формы и в классе формы опишем следующую функцию:

Копировать в буфер обмена
private int GetColumnVisibleIndex(string columnName)
{
  int index = 0;
  // Если включен режим автонумерации увеличиваем индекс на 1
  if (V8EditGrid1.AutoNumberColumn)
    index++;
  foreach (V8EditGridColumn column in V8EditGrid1.Columns)
  {
    // Пропускаем невидимые колонки
    if (!column.Visible)
      continue;

    if (column.ColumnName == columnName)
      return index;

    index++;
  }
  return -1;
}

Теперь мы готовы создать обработчик события ItemDataBound. Выбираем на форме элемент управления V8EditGrid1 и на закладке Events в окне Properties делаем двойной щелчок мышью на событии ItemDataBound. В полученном обработчике размещаем следующий код:

Копировать в буфер обмена
private void V8EditGrid1_ItemDataBound(object sender, _1C.V8.WebControls.V8GridItemEventArgs e)
{
  // Только для строк с данными
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.SelectedItem)
  {
    // Позиция колонки "Количество"
    int quantityIndex = GetColumnVisibleIndex("Количество");
    // Позиция колонки "Цена"
    int priceIndex = GetColumnVisibleIndex("Цена");

    // Получаем значение "Количество"
    decimal quantity =
      (e.Item.Value(quantityIndex) is decimal) ? (decimal)e.Item.Value(quantityIndex) : 0;
    // Получаем значение "Цена"
    decimal price =
      (e.Item.Value(priceIndex) is decimal) ? (decimal)e.Item.Value(priceIndex) : 0;

    // Рассчитываем итоговую сумму по строке
    decimal total = quantity * price * 0.18;

    // Позиция колонки "Итого"
    int totalIndex = GetColumnVisibleIndex("Итого");
    // Присваиваем итоговое значение
    ((V8EditGridCell)e.Item.Cells[totalIndex]).Value = total;
  }
}

Последнее действие, которое нам осталось выполнить – это предоставить пользователю возможность вызвать пересчет данных.

Создадим кнопку на командной панели, связанной с элементом управления V8EditGrid1. Выбираем на форме элемент V8CommandPanel3 и в его коллекцию Buttons добавляем кнопку со следующими свойствами:

Свойство Значение свойства
CommandType Custom
CommandName Recalc
ButtonText Пересчет
RightAlign True
Type decimal(10,2,Any)

Создадим обработчик этой кнопки. На закладке Events в окне Properties делаем двойной щелчок мышью на событии ItemCommand и размещаем в полученном обработчике следующий код:

Копировать в буфер обмена
private void V8CommandPanel3_ItemCommand(object source, System.Web.UI.WebControls.CommandEventArgs e)
{
  // Команда от кнопки "Пересчет"
  if (e.CommandName == "Recalc")
  {
    // Получить данные от элементов управления
    ItemDataSource.GetDataFromForm();
    // Вызвать связывание элементов управления с данными
    // из источника данных
    ItemDataSource.SetDataToForm();
  }
}

В результате мы получили форму редактирования элемента, в которой элемент управления V8EditGrid, связанный с табличной частью, содержит вычисляемую колонку для отображения итоговой сумм по строкам табличной части.