При создании веб-приложений зачастую возникает задача реализации в элементе управления 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 |
Но прежде мы должны описать функцию, которая нам позволит получать позиции колонок с учетом автонумерации и невидимости некоторых данных. Переключимся в режим редактирования 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, связанный с табличной частью, содержит вычисляемую колонку для отображения итоговой сумм по строкам табличной части.