1.2.4. Список и древовидный список

Классы фреймов:

class btkFrame.TbtkLookUpGridFrame
class btkFrame.TbtkLookUpGridTabFrame
class btkFrame.TbtkLookUpGridTabDynamicFrame
class btkFrame.TbtkLookUpGridTabDynDetFrame
class btkFrame.TbtkLookUpTreeFrame
class btkFrame.TbtkLookUpTreeTabDynamicFrame
class btkFrame.TbtkLookUpTreeTabDynDetFrame
class btkFrame.TbtkLookUpTreeTabFrame

1.2.4.1. Свойства фреймов

Раздел находится в разработке.

Пока описаны не все свойства.

Свойство Описание
HeaderVisible Управляет видимостью заголовка.
ToolBarVisible Управляет видимостью панели управления.
AutoFilter.PopupListMode Управляет режимом работы автофильтра.

1.2.4.2. Сортировка полей

  • Поля сортируются в соответствии с порядком, указанным в свойстве их атрибута “Порядковый номер” (nOrder).

    • Если у поля нет атрибута, то порядковый номер = MaxInt (такие поля помещаются в конец).
    • Если у полей одинаковый порядковый номер, то они сортируются по алфавиту за исключением случаев, когда порядковый номер равен MaxInt.
  • Порядок колонок соответствует порядку полей.

  • Порядковый номер бэнда определяется как наименьший порядковый номер среди содержащихся в нём колонок.

  • Колонки, для которых не указан бэнд, объединяются в бэнд по умолчанию.

  • Изменение бэнда у колонки с помощью метода SetVarDesc или путём добавления к наименованию атрибута имени бэнда через “|” происходит, когда колонки уже созданы и объединены в бэнды. При этом:

    • Если назначенный бэнд существует, то колонка добавляется в его конец, независимо от порядкового номера. Положение бэнда при этом не пересчитывается.
    • Если бэнд новый, то он ставится перед самым левым бэндом с бОльшим порядковым номером, или в конец, если такого бэнда нет. Если есть другие бэнды с таким же порядковым номером, то новый бэнд помещается после них.
    • Тот бэнд, из которого колонка была перемещена, остаётся на месте, даже если его порядковый номер изменился.

Note

Алгоритм сортировки работает одинаково для статических и динамических полей.

1.2.4.2.1. Управление порядком колонок

Обеспечить требуемый порядок колонок и бэндов при загрузке выборки можно одним из следующих способов:

  • Установить порядковый номер атрибутов в том же порядке, в котором должны появиться соответствующие им колонки. Для всех колонок указывать их бэнд до открытия выборки с помощью свойства GroupAttr.Band (Группы объединения).
  • Установить порядковый номер атрибутов в том же порядке, в котором должны появиться соответствующие им колонки. Для всех колонок указывать бэнд через вертикальную черту с помощью метода SetVarDesc. Это нужно сделать до показа колонок (например, в AfterOpen). Свойство “Группы объединения” при этом нужно оставить пустым.

Поскольку эти решения имеют разный принцип сортировки, при одновременном использовании они могут привести к неожиданным результатам.

1.2.4.3. Экспорт из списочных фреймов

Note

Актуально для версии клиента > 5.3
В 4.30 в дереве нет возможности число вывести в эксель в числовом формате из редактора etEdit.
  • Через пункт меню “Сохранить как…”

    Документ Excel (*.xls; *.xlsx).

    Экспорт средствами DevExpress.

    Числовое поле при редакторах etEdit, etLookUP, etButtonsEdit определяется по наличаю маски ввода либо формата отображения (только для древовидного списка, для простого табличного списка, достаточно того, чтобы тип данных поля был числовой). В случае наличия маски происходит преобразование к Variant. Какой тип, такой формат и будет у ячейки. В случае формата отображения, Excel проставляется формат отображения.

    Делфи формат отображение не эквивалентен Excel формату отображения (статья на сайте msoffice). Компоненты пытаются наиболее близко конвертировать формат отображения делфи в формат отображения Excel.

    Документ Excel без форматирования (*.xlsx).

    Экспорт нашими средствами.

    Отличительной чертой является автоматическая установка формата ячеек Excel, соответствующего типу данных атрибутов списка. Например, столбцы с типом редактора “Денежный” сохраняются в Excel как числа с 2-мя знаками после запятой. Числовые столбцы сохраняются как числа со стандартным представлением Excel. Это дает возможность использовать значения экспортированных ячеек в формулах Excel. Реализованный экспорт без форматирования поддерживает заголовки столбцов, но не работает с бандами.

    Возможность формирования XLSX- и XLSM- отчетов, содержищих до 1 млн. строк и 16 тыс. столбцов на каждой закладке

  • Дополнительные пункты древовидного списка

    Документ Excel c группировкой строк (*.xlsx).

    Дерево формируется не отступами с помощью пустых ячееек как в Девэкспресс, а группировкой строк Excel.

    В начале строятся стандартными средствами DevExpress, а следом наша пост обработка заменяет ведущие пустые ячейки на отступы первых ячеек строк.

  • Через пункт меню “Открыть как XLSX”

    Экспорт средствами DevExpress.

    Работает также как и через пункт меню “Сохранить как…”, но без диалоговых окон. При выборе этого пункта экспорт производится во временный файл который сразу открывается в Excel, или в другом ассоциированном с *.xlsx файлами приложении.

1.2.4.4. Транспонированный список

1.2.4.4.1. Настройка транспонированного грида

1.2.4.4.1.1. Общие положения

Любой Grid-фрейм начиная с клиентской версии 1.4.18.28 поддерживает возможность построения грида не напрямую от выборки, а динамически – по отдельно выполняемым запросам, возвращающим перечень столбцов, строк грида, и непосредственно данных.

Под каждый запрос необходимо наличие отдельной выборки (или отдельных отображений выборки).

Выборка данных возвращает перечень записей, данные из которых будут размещены в транспонированном гриде. Привязка данных к конкретным строкам и столбцам транспонированного грида осуществляется при помощи ключевых полей в выборке данных и выборках строк и столбцов. Кроме того, в связи с возникающей необходимостью вынесения нескольких атрибутов выборки данных в отдельные столбцы транспонированного грида, имеется возможность привязки конкретного столбца выборки данных к конкретному столбцу транспонированного грида. Таким образом, привязка данных к столбцам транспонированного грида осуществляется по двойному соответствию: совпадению значений ключевых полей и имени столбца выборки данных со значением дополнительного поля выборки столбцов.

В качестве ключевых полей нужно использовать поля с типом «строка».

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

Порядок, в котором выборка столбцов возвращает данные, определяет порядок следования столбцов транспонированного грида.

Выборка строк возвращает перечень строк транспонированного грида в порядке их следования в транспонированном гриде. Часть столбцов выборки строк может быть выведена в качестве обычных, дополнительных столбцов транспонированного грида. Они будут идти первыми, перед столбцами, построенными динамически. В выборке строк должен иметься ключевой атрибут, по значениям которого будет осуществляться привязка строк с данными к конкретной строке транспонированного грида.

1.2.4.4.1.2. Настройка при помощи свойств

1.2.4.4.1.3. Общие настройки

Настраивается транспонированный грид на закладке «Транспонирование» карточки выборки.

Ключевым с точки зрения настройки является свойство «Транспонировать данные» (<фрейм>. TransposeDataSet). Оно должно быть включено.

1.2.4.4.1.4. Настройка свойств данных

В свойствах «Атрибут внешнего ключа для выборки атрибутов» (<фрейм>.TransposeDataSetAttrKey) и «Атрибут внешнего ключа для выборки строк» (<фрейм>.TransposeDataSetRowKey) указываются атрибуты в выборки данных, по значениям которых данные из этой выборки будет отнесены в соответствующую строку и столбец транспонированного грида.

В свойстве «Атрибуты с данными» (<фрейм>.TransposeDataSetValueAttr) указывается список атрибутов (через точку с запятой), которые будут транспонироватся.

В свойстве «Атрибуты со стилями раскраски данных» (<фрейм>.TransposeDataSetStyleAttr) указывается список атрибутов (через точку с запятой), в которых указывается стиль раскраски для соответствующего атрибута с данными. Порядок указания атрибутов раскраски соответствует порядку атрибутов с данными. Можно пропускать указание атрибута раскраски для атрибута с данными. Это свойство не обязательное.

В свойстве «Стили раскраски ячеек, для которых нет записей в выборке данных.» (<фрейм>.TransposeDataSet EmptyCellStyle) указывается список стилей раскраски (через точку с запятой) для ячеек в транспонированном гриде для которых нет записей в выборке данных. Это свойство не обязательное.

1.2.4.4.1.5. Настройка свойств столбцов

В свойстве «Выборка атрибутов» (<фрейм>. AttrSelection) указывается выборка и отображение, GST которых вернет перечень столбцов грида. Указание происходит в формате <Имя выборки>.<Имя отображения>.

В свойстве «Ключевой атрибут выборки атрибутов» (<фрейм>.AttrSelectionKeyAttr) необходимо указать атрибут выборки со списком атрибутов, в котором будет возвращено ключевое значение привязки записей в выборке данных к конкретному столбцу транспонированного грида.

В свойстве «Атрибут с именем показателя» (<фрейм>.AttrSelectionDataFieldAttr) указывается атрибут выборки со списком атрибутов, в значении которого будет указан столбец (имя столбца) выборки данных, который должен быть визуализирован в колонке транспонированного грида. Возможные имена столбцов, возвращаемые атрибутом, указанном в данном свойстве, должны присутствовать в подмножестве атрибутов показателей, заданных в свойстве «Атрибуты показателей» (<фрейм>.TransposeDataSetValueAttr)

В свойстве «Атрибут заголовков» (<фрейм>.AttrSelectionCaptionAttr) указывается атрибут выборки со списком атрибутов, в значении которого будет указан заголовок столбца. Для группировки столбцов используйте формат заголовка в виде <Заголовок столбца>|<Заголовок группы>.

В свойстве «Атрибут со стилем показателя» (<фрейм>.AttrSelection StyleAttr) указывается стиль раскраски для данного столбца. Раскраска ячейки имеет более высокий приоритет, чем этот стиль.

1.2.4.4.1.6. Настройка свойств строк

В свойстве «Выборка строк» (<фрейм>. RowSelection) указывается выборка и отображение, GST которых вернет перечень строк грида. Указание происходит в формате <Имя выборки>.<Имя отображения>.

В свойстве «Ключевой атрибут выборки строк» (<фрейм>. RowSelectionKeyAttr) необходимо указать атрибут выборки строк, в котором будет возвращено ключевое значение привязки записей в выборке данных к конкретной строке транспонированного грида.

1.2.4.4.1.7. Возможности редактирования, обновления и отладки

Все операции выполняются в контексте выборки данных. Выборки строк и столбцов можно найти используя функцию FindSelection.

При навигации по транспонированному гриду (мышкой или курсорными клавишами) происходит позиционирование во всех трех выборках: выборки данных, строк и атрибутов. Это позволяет пользоваться функцией GetVar для получения текуших значений атрибутов.

Существуют следующие возможности по выделению данных:

  • выделение произвольной прямоугольной области при помощи мышки или курсорных клавиш + Shift;
  • выделение целых строк данных при помоши мышки или курсорных клавиш (если выделение затрагивает столбцы из выборки строк) или клавиши Ins;
  • выделение произвольных строк при помощи мышки + удерживание клавиши Ctrl;
  • выделение всех строк при помощи Ctrl+A ;

Во всех случаях в выборке данных свойство SelectedRecords будет заполнено выбранными строками. Также в выборках строк и столбцов SelectedRecords будет содержать выделенных диапазон.

При редактировании ячейки грида будет происходить редактирование выборки данных для соответствующей строки и столбца. Если для такой комбинации строки и столбца нет данных в выборке данных, то произойдет вставка новой строки (в операции InsertItem нужно проставить все ключевые и обязательные поля для новой строки).

При обновлении выборки данных (Selection.Refresh) происходит обновление данных в транспонированном гриде. При обновлении выборки строк или выборки столбцов произойдет перестроение транспонированного грида (выборка данных не обновится). Есть специальный метод, позволяющий сразу обновлять данные, строки и столбцы в любой комбинации: Selection.RefreshTranspose (<Флаг обновления данных>, <Флаг обновления строк>, <Флаг обновления столбцов>).

Есть возможность частичного обновления выборки данных. Для этого нужно написать операцию, аналогичную GST, возвращающую нужные строки и вызвать метод Selection.Merge (<Имя операции>). Вызываемая операция должна быть аналогична GetSQLText выборки данных, и предназначена для возвращения набора данных, которые необходимо обновить в транспонированном гриде. При вызове Merge, грид выполнит этот запрос и обновит себя и соответствующие строки в выборке данных. Megre выполняется в контексте мастер выборки выборки данных. Для вызова в контексте выборки данных есть метод Selection .Merge2(<Имя операции>), полностью идентичный функционально методу Merge. Контекст влияет на подстановку значений параметрам SQL скрипта. Так как имя столбца в транспонированном гриде формируется динамически, то для получения поля нельзя использовать функцию FindField . Вместо этого используйте функцию TransposeFieldByKey(<значение ключа выборки атрибутов>, <имя поля>). Например, чтобы зафиксировать динамический столбец слева напишите:

Пример фиксации динамического столбца
<pascal>
  F := Selection.TransposeFieldByKey(2, 'Value');
  if Assigned(F) then
    Selection.Controller.FixColumn(F.FieldName, True);
</pascal>

При смене активной ячейки будет выполняться операция с именем «OnFocusedCellChanged».

Для упрощения отладки в окне SelectionDebugWindow добавлена закладка «Транспонирование». На ней расположены закладки, на которые выводятся результаты всех 3-х запросов: данных, строк, столбцов. На 4-й закладке выводится результат операции Merge.

1.2.4.4.1.8. Ограничения

В текущей версии имеются ограничения в быстродействии при работе с большим количеством столбцов. Время работы грида DevExpress увеличивается в квадратичной зависимости при возрастании количества столбцов.

Таким образом, пока не следует осуществлять построения транспонированного грида при количестве столбцов, большем 400.

1.2.4.4.1.9. Пример

Создайте выборку с 3 представлениями: AttrList, RowList и Data.

GST представления AttrList
select
  1 as id,
  'Столбец 1' as Caption,
  'Value' as Data
from
  dual
union select
  2 as id,
  'Столбец 2' as Caption,
  'Value' as Data
  from dual
  union
  select 3 as id,
  'Столбец 3' as Caption,
  'Value' as Data
from
  dual
GST представления RowList
select
  1 as id,
  'Строка 1' as Caption
from
  dual
union select
  2 as id,
  'Строка 2' as Caption
from
  dual
union select
  3 as id,
  'Строка 3' as Caption
from
  dual
GST представления Data
select
  1 as id,
  2 as IdAttr,
  2 as idRow,
  5 as Value
from
  dual
union select
  2 as id,
  3 as IdAttr,
  3 as idRow,
  6 as Value
from
  dual

Заполните свойства на закладке «Транспонирование» в отображении Data согласно приведенному рисунку:

../../../_images/Transpose_props.jpg

Откройте выборку в отображении Data. У Вас должен получится следующий грид:

../../../_images/Transpose_View_Example.png

1.2.4.5. Выделение нескольких записей (мультиселект)

Во фреймах типа список и древовидный список существует возможность выбора нескольких записей (мультиселект). Изменять режим мультиселекта можно следующими способами:

  • При вызове списка с помощью методов TbtkScriptSelectionObject.DoLookup или TbtkScriptSelectionObject.DoLookupEx

    Пример включения режима мультиселект в TbtkScriptSelectionObject.DoLookupEx
    <pascal>
      R := DoLookupEx(
        '',
        'SEL_TST_MultySelectFromGrid',
        [],
        [],
        ['id','A1'],
        True, //параметр отвечающий за мультиселект
        ['Representation'],
        ['Choose']);
    </pascal>
    
  • С помощью свойства фрейма MultiSelect. Также его значение можно передать в качестве параметра в TbtkScriptSelectionObject.CreateFormEx

  • С помощью TbtkScriptSelectionObject.SetVar.

    Пример изменения режима мультиселект через TbtkScriptSelectionObject.SetVar
    <pascal>
      SetVar('MultiSelect', 1); //включение
      SetVar('MultiSelect', 0); //отключение
    </pascal>
    

Note

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

1.2.4.5.1. Методы и свойства паскаль скриптера

TbtkScriptSelectionObject.SelectedRecordsCount
Количество выделенных записей.
TbtkScriptSelectionObject.SelectedValue
Значение выделенной записи по индексу поля.
TbtkScriptSelectionObject.SelectedValuebyName
Значение выделенной записи по имени поля.

1.2.4.6. Всплывающие подсказки в ячейках

Всплывающая подсказка выводится во всплывающем окне при наведении мышки на ячейку.

В зависимости от настроек, во всплывающей подсказке может выводиться текст ячейки или комментарий.

Note

Комментарий к ячейке является более приоритетным, чем подсказка при большом тексте.

1.2.4.6.1. Подсказка при большом тексте

Свойство фрейма CellHint задаёт отображение всплывающей подсказки с текстом ячейки в случаях, когда текст превышает размер ячейки (отображается не полностью).

1.2.4.6.2. Комментарий к ячейке

Свойство фрейма CommentAttribute задаёт атрибут с информацией о ячейках с комментариями.

Для работы комментариев должны быть заданы значения для атрибута ID.

1.2.4.6.2.1. Текст комментария

Задаётся при помощи CommentTextAttribute и Selection.Controller.Hints.

1.2.4.6.2.2. Маркер наличия подсказки в ячейке

  • Отображается в виде треугольника в верхнем правом углу ячейки.
  • Отображение маркера задаётся свойством фрейма ShowHintCellMark.
  • Цвет маркера задаётся в значении CommentAttribute.

Attention

Маркер отображается только в списочных фреймах.