Таблица. Колонки#
Для примера создадим таблицу «Прайс-лист» с перечнем товаров и цен, и по отдельной кнопке вычислим среднюю цену и количество товаров, выведем ее в отдельном поле.
В существующую форму ControlsForm.xml добавим таблицу. Для этого в макете добавьте следующий код: (Добавление в ControlsForm.xml таблицы)
После сборки на форме должна появиться группа с таблицей:
Протестируйте результат: создайте несколько строк и заполните цену и товар.
Теперь добавим в группу после Grid кнопку и поле для вывода:(Добавление кнопки и текстового поля)
Результат:
В Лексеме элементы управления полноценно работают только с Observable объектами (библиотека Knockout). Поэтому для начала надо проинициализировать его содержимое, чтобы была возможность добавлять и удалять строки. Сделаем это при загрузке формы (из конструктора класса). Добавьте в класс формы:
Приведение обычных объектов в Observable выполняется функцией ko.mapping.fromJS(), наоборот функцией: ko.mapping.toJS().
Чтобы получить результат объекта в Observable формате, надо выполнить его как функцию, результат ее выполнения - значение объекта. Что бы присвоить значение - вызвать как функцию и ее в параметр вставить новое значение.
Вводить информацию в таблицу при каждом запуске неудобно, добавим автоматическое заполнение при загрузке. Для этого добавим в класс формы свойство dataGrid: (Свойство dataGrid)
Теперь вместо пустого массива передадим в таблицу этот массив:
В ControlsForm.js файл добавим реализацию для нажатия на кнопку Calc (ButtonCalc_clicked). (Реализация функции ButtonCalc_clicked)
Результат:
Содержимое таблицы хранится в свойстве dataSource. Так как это он в Observable форме, то обращаемся к нему вызвав его как функцию. Аналогично с его свойством Price.
В нашем примере цена имеет строго целое значение, но цена может быть дробной, добавим формат выводимого значения. Для этого в макете добавим свойство cellsformat в колонку указав формат.
*Формат D означает дробное число, 2 - количество знаков после запятой.
Результат:
Самостоятельно сделайте проверку на сумму, надо не учитывать строки с отсутствующей суммой.
Группировка#
Добавим в таблицу еще один столбец “Группа товара” и сделаем группировку по нему. Чтобы уместить новую колонку в таблицу, уменьшим “Товар” до 40%. (Добавление столбца “Группа товара”)
Результат:
Теперь настроим возможность группировки в Grid, добавьте к его параметрам:
Должно появиться поле для группировки:
Проверим как работает: заполните несколько строк и перетащите заголовок столбца “Группа товара” в панель группировки. Результат:
Но при загрузке формы эта группировка не сохранится. Есть возможность указать группировку из кода, настроим ее при загрузке формы. Добавьте в конструктор формы строку:
Теперь при открытии формы у таблицы будет включена нужная группировка.
Изображение в ячейке#
Добавим иконку в ячейку и сделаем вывод в текстовое поле информацию о товаре. В ControlsForm.xml добавим новую колонку ‘Info’, вдобавок поменяем местами столбцы и настроим ширину. (Добавление столбца “Info”)
Вынесем сперва столбец, по которому настроена группировка, в конец вынесем столбец с иконкой (c фиксированной шириной).
В ControlsForm.js добавим реализацию метода info_imageRenderer. (Реализация метода info_imageRenderer)
Вверх в модуль добавим импорт картинки для infoImg. (Импорт картинки для infoImg)
Результат:
Событие#
Клик в ячейку#
Теперь надо отловить событие нажатия на колонку с иконкой и вывести нужную информацию. В параметр Grid добавьте:
В файл ControlsForm.js добавим его реализацию
Теперь при клике в ячейку в консоли браузера будет выводиться информацию о событии.
Добавим условие, чтобы:
Выводилась информация о текущем товаре.
Вывод работал только при нажатии на ячейку “Инфо”.
Изменим реализацию:
Результат при нажатии на Инфо в 1й строке:
Для завершения выведем пояснение при наведении на ячейку “Инфо”. В макете в столбце добавьте параметр:
Результат:
Закраска ячейки#
В ControlsForm.xml добавим в Grid следующий параметр:
В ControlsForm.js добавим реализацию 'Grid1_cellPainter':
Данная функция всегда должна возвращать значение - цвет. Коллекция цветов содержится в объекте Colors Лексемы. Поэтому надо сперва его импортировать, добавим его в строку импорта:
Добавим условие в функцию возврата цвета, пусть ячейки в колонке Price будут жёлтые, если больше 100, иначе зеленые, и синим закрасить весь столбец Info.
Суммовые поля#
Добавим в таблицу итоговое поле для цены, содержащее среднюю цену. В Grid добавим параметры showAggregates='true' showStatusBar='true'. В ControlsForm.xml в колонку с ценой надо добавить ColumnAggregate :
В type укажем avg, то есть среднее. теперь можно сравнить с нашим значением.
Обычно это поле используется для вывода суммы по колонке, в этом случае type=‘sum’.
Первая строка выводит сумму по строке, вторая сумма по выделенным строкам. В данный момент выделение у таблицы тип выделения стоит singlecell, изменим его на multiplerows, чтобы можно было выделить несколько строк.
Результат:
В данном примере выделены строки 1 и 2.
Группа колонок#
Объединим колонки «Группа товара» и «Товар» в единую группу «Товар», а колонки переименуем в «Группа» и «Наименование». Для этого обернем обе колонки в ColumnGroup.
Также можно сделать высоту таблицы хотя бы 400px, и спрятать с формы группы с примерами их предыдущей практики, чтобы не мешались, добавив параметр visible='false'.
Результат:












