Как я уже говорил в предыдущем посте, бывает несколько видов Grid View. В частности – Card View, Table View, Banded Table View (расширение Table View) и Chart View. На рисунке приведена схема наследования для соответствующих классов.
Из рисунка видно, что для каждого вида View существуют реализации с привязкой к источнику данных и без нее. В официальной документации содержаться пошаговые руководства по использованию каждого из трех видов View (Table View, Card View и Chart View) с привязкой к источнику данных. Если вы четко представляете себе структуру грида (то, как связаны между собой грид, level и view), то, действительно все выглядит очень просто.
В предыдущей части данного повествования мы использовали Table View. Прежде чем перейти к рассмотрению остальных видов Grid View, предлагаю сначала несколько подробней разобраться с настройками данного отображения.
Все свойства TcxDBGridDBTableView сгруппированы в классы. Общее количество свойств довольно велико, и описывать в рамках данного обзора не имеет смысла. Вместо этого я попробую описать как настроить TcxDBGridDBTableView, что бы добиться от него определенного поведения.
Группировка данных.
По умолчанию для нового объекта TcxDBGridDBTableView группировка данных включена. Если вы заметили, в верхней части грида находится область с надписью “Drag a column header here to group by that column” (перетащите заголовок столбца сюда, для того, что бы сгруппировать по данному столбцу). Действительно, если вы запустите приложение и попытаетесь перетащить заголовок столбца на область с данной надписью, то увидите, что данные будут сгруппированы. Группировка может быть многоуровневой.
За саму возможность группировки отвечает свойство OptionsCustomize.ColumnGrouping. Если мы выполним следующий код, то возможность группировки не будет поддерживаться, а область для перетаскивания исчезнет. Хотя, если на данный момент ваши данные были сгруппированы по каким-либо колонкам, то эта группировка сохранится.
cxGrid1DBTableView1.OptionsCustomize.ColumnGrouping:=False; cxGrid1DBTableView1.OptionsView.GroupByBox:= False;
Управлять группировкой полей можно и программно.
Допустим, у нас есть колонки грида, которые называются (свойство Name) cxGrid1DBTableView1langId и cxGrid1DBTableView1pr. Для того, что сгруппировать данные по этим колонкам нужно выполнить следующий код:
cxGrid1DBTableView1langId.GroupIndex:=0; cxGrid1DBTableView1pr.GroupIndex:=1;
Свойство Options.Grouping отвечает за возможность группировки по данному столбцу.
Для того, что бы сделать значения колонок, по которым сгруппированы данные видимыми в самом гриде, а не только в области группировки, необходимо присвоить свойству OptionsCustomize.ColumnHidingOnGrouping значение false.
cxGrid1DBTableView1.OptionsCustomize.ColumnHidingOnGrouping:=False;
Все довольно просто. Тем не менее, нужно быть аккуратным с группировкой, особенно по столбцам, соответствующим ключевым полям. Допустим, вы сгруппировали данные по столбцу cxGrid1DBTableView1id, поле ID является ключевым автоинкрементным. После этого вы пытаетесь добавить запись. В результате вы получите сообщение “Field ‘Id’ cannot be modified”.
Что бы избежать подобной ситуации я использую примерно следующий код перед добавлением записи:
for i:=0 to cxGrid1DBTableView1.ColumnCount-1 do begin cxGrid1DBTableView1.Columns[i].GroupIndex:=-1; end; if DataSet.State in [dsInsert, dsEdit] then try DataSet.Post; finally end;
Соответственно, потом порядок группировки можно возвращать в исходное состояние. Я не ручаюсь за то, что такое решение – оптимальное. Но я нашел его самостоятельно быстрее, чем в документации (все же, 3 400 страниц англоязычного текста не шутка, даже если текст неплохо структурирован) и оно работает. Если Вы знаете более простой и действенный способ – поделитесь.
Сортировка
Если вы нажмете на заголовке столбца мышкой, то данные будут отсортированы по данному столбцу. Повторное нажатие приведет к изменению порядка сортировки. Такое поведение TcxDBGridDBTableView установлено по умолчанию. Также поддерживается сортировка по нескольким полям. Для этого нужно на втором поле нажать мышкой, придерживая клавишу Ctrl (Ctrl+Mouse Left). Снять с поля сортировку так же можно с помощью этой комбинации. Порядок сортировки и сам факт ее наличия показывается с помощью специальной пиктограммы в виде треугольника на заголовке поля.
Свойство OptionsCustomize.ColumnSorting отвечает за возможность сортировки колонок.
cxGrid1DBTableView1.OptionsCustomize.ColumnSorting:= False;
С помощью свойства Options.Sorting можно отключить сортировку отдельного столбца.
Как и в случае с группировкой порядком сортировки можно управлять программно:
cxGrid1DBTableView1id.SortOrder:= soAscending; cxGrid1DBTableView1id.SortIndex:=0;
О фильтрации данных и других функциональных возможностях TcxDBGridDBTableView речь пойдет в следующей части…
Другие статьи серии:
DevExpress. Заметки на полях #0
DevExpress. Заметки на полях #1
DevExpress. Заметки на полях #2
DevExpress. Заметки на полях #3
DevExpress. Заметки на полях #3.5
DevExpress. Заметки на полях #5
DevExpress. Заметки на полях #7
DevExpress. Заметки на полях #8
DevExpress. Заметки на полях #9
DevExpress. Заметки на полях #10
DevExpress. Заметки на полях #11
DevExpress. Заметки на полях #12
DevExpress. Заметки на полях #13
DataModule2.Table1.Edit;
DataModule2.Table1.Fields[7].AsString := IntToStr(StrToInt(DataModule2.Table1.Fields[7].AsString) – 1);
DataModule2.Table1.Post;
field ‘HT’ cannot be modified
что это значит!
Вообще, правило хорошего тона – вызывать поле по имени.
DataModule2.Table1.FieldByName(‘HT’).AsString:=’Чего-то там';
А во вторых оно, возможно действительно не может быть модифицировано. Например, если оно вычисляемое…