Сортування dbgrid при натисканні на колонці, delphisite

InsertOrderBy # 40; Query, NewOrder # 41; ;

procedure TForm1. FormCreate # 40; Sender: TObject # 41; ;

TheWidth, a: Integer;

DBGrid1. Options: = DBGrid1. Options - # 91; dgTitles # 93; ;

HeaderControl1. Sections. Add;

HeaderControl1. Sections. Items # 91; 0 # 93 ;. Width: = 12;

Table1. Exclusive: = True;

Table1. Active: = True;

for a: = 1 to DBGrid1. Columns. Count do

Table1. Active: = False;

Table1. Exclusive: = False;

Table1. Active: = True;

Після того як THeaderControl замінив стандартний заголовок DBGrid, в першу чергу ми скидаємо (встановлюємо в False) прапор dgTitles у властивості Options компонента DBGrid. Потім ми додаємо колонку в HeaderControl і встановлюємо її ширину, рівну 12. Це буде порожньою колонкою, яка має ту ж ширину, що і ліва колонка статусу в DBGrid.
Потім потрібно переконатися що таблиця відкрита для ексклюзивного доступу (ніякі інші користувачі використовувати її не зможуть). Причину я поясню трохи пізніше.
Тепер додаємо секції в HeaderControl. Для кожної доданої колонки ми створюємо в заголовку той же текст, що і у відповідній колонці DBGrid. У циклі ми проходимо по всіх колонках DBGrid і повторюємо текст заголовка колонки і його висоту. Ми також встановлюємо для HeaderControl значення властивостей MinWidth і MaxWidth, рівними ширині відповідної колонки в DBGrid. Це охоронить колонки від зміни їх ширини. Для змінюють розмір колонок потрібно додаткове кодування, і я вирішив не позбавляти Вас цього задоволення.
Тепер найцікавіше. Ми збираємося створити індекс для кожної колонки в DBGrid. Ім'я індексу буде таким же, як і назва колонки. Даний код ми повинні укласти в конструкцію try..finally, оскільки існують деякі поля, які не можуть бути проіндексовані (наприклад, Blob- і Memo-поля). При спробі індексації цих полів генерується виняткова ситуація. Ми перехоплюємо це виняток і недопускати можливості клацання на цій колонці. Це означає, що колонки, що містять неіндексовані поля, не реагуватимуть на клацання мишею. Створення цих індексів є поясненням того, чому таблиця повинна бути відкрита в режимі ексклюзивного доступу. І на закінчення ми закриваємо таблицю, скидаємо прапор ексклюзивності і знову робимо таблицю активною.
Останній крок. При натисканні на HeaderControl нам необхідно включити правильний індекс таблиці. Створимо оброблювач події OnSectionClick компонента HeaderControl як показано нижче:

procedure TForm1. HeaderControl1SectionClick # 40;

HeaderControl: THeaderControl; Section: THeaderSection # 41; ;

Table1. IndexName: = Section. Text;

Це все! Після клацання на заголовку колонки значення властивості таблиці IndexName стає рівним заголовку компоненту HeaderControl.
Просто і красиво, да? Проте є маса місць, які потребують поліпшення. Наприклад, вторинний клацання повинне відновлювати порядок сортування. Або можливість зміни розміру самих колонок. Спробуйте самі, це не складно!
покращення
Тут наведено покращений код в порівнянні з попередньою версією "Ради", він полягає в використанні в якості імені індексу ім'я поля замість заголовка.
Це покращує гнучкість. Зміни вказані похилим курсивом.

procedure TfrmDoc. FormCreate # 40; Sender: TObject # 41; ;

Dbgrid1. Options: = DBGrid1. Options - # 91; DGTitles # 93; ;

Headercontrol1. sections. Add;

Headercontrol1. Sections. Items # 91; 0 # 93 ;. Width: = 12;

for a: = 1 to DBGRID1. Columns. Count do

Схожі статті