![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка данных по нажатию на заголовок DBGrid
duponamk © (2015-01-22 04:26:00)День добрый, уважаемые.
Нужен совет, как заставить нормально работать сортировку по клику на заголовке DBGrid'а.
Индексы я создал, сортировка по ним из отдельной формы идет как надо.
На форме DBGrid из пакета AlphaControls (прога, соотв., тоже на этих контролах строится).
Для отображения инфы из базы используется 6 полей, соотв., в размер грида полностью помещается инфа 4х полей. 2 последних уползают за край грида.
Так вот, если я нажимаю на заголовках первых 4х столбцов - сортировка происходит нормально. А если тыкнуть на последних 2х заголовках, предварительно прокрутив окно, чтобы они стали видны - прога считает, что я нажал на 4ом столбце и сортирует соответственно.
Сортировка организована так:
...
IndexesList: array[0..5] of string;
...
//Запишем названия индексов в массив
IndexesList[0] := 'index_idx';
IndexesList[1] := 'opsname_idx';
IndexesList[2] := 'region_idx';
IndexesList[3] := 'autonom_idx';
IndexesList[4] := 'area_idx';
IndexesList[5] := 'city_idx';
...
procedure TPstIdxMainForm.GridTitleClick(Column: TColumn);
begin
ShowMessage(IntToStr(Column.Index));
PstIdxDat.Table1.Active := False;
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[Column.Index];
PstIdxDat.Table1.Active := True;
end;
Как поправить код, чтобы сортировка отрабатывала на нужных столбцах правильно? Раньше просто этого не надо было, сейчас решил добавить - и задумался :).
Использую Delphi XE4.
PS. Просьба: EhLib, сортировку с помощью SQL запросов, THeaderControl - не предлагать (не то пальто :)).
duponamk (2015-01-26 06:26:00) [1]
> думаю, тип датасета тут рояли не играет, главное, что FieldName
> приходит правильный
Ты прав, тип датасета роли не играет, если имя поля правильное.
> Пробуешь, конечно, на чистом проекте, не на рабочем?
Может, это и неправильно, но делаю прямо на рабочем проекте: нет времени на создание нового и проверки всего вышепредложенного в новом проекте.
Проблема решилась: установил версию 9.19 AphaControls с AlphaDB-Aware, удалил с формы DBGrid, добавил ее по-новой - глюк исчез. Delphi не обновил в проекте инфу о том, что стоит новый набор компонентов.
Сейчас, насколько я могу судить, все работает как надо.
Спасибо всем за помощь. Тему можно закрывать.
Inovet (2015-01-25 23:36:00) [2]> [34] duponamk © (25.01.15 19:12)
> У меня уже мозги набекрень от этой проблемы.
Пробуешь, конечно, на чистом проекте, не на рабочем?
junglecat (2015-01-25 21:10:00) [3]такой вариант работает на ура
procedure TForm1.sDBGrid1TitleClick(Column: TColumn);
begin
ADODataSet1.IndexFieldNames := Column.FieldName;
end;
думаю, тип датасета тут рояли не играет, главное, что FieldName приходит правильный
junglecat (2015-01-25 19:41:00) [4]возможно, это какой-то косяк именно XE4
В ХЕ3 все пучком
duponamk (2015-01-25 19:12:00) [5]
> Ну я же не совсем тупой. Конечно, я твою ситуацию воспроизвел
Извини, не хотел обидеть.
У меня уже мозги набекрень от этой проблемы.
Если в ближайшее время не удастся ее решить - буду думать в сторону уменьшения ширины столбцов, чтоб они влезли, блин, в грид.
Но у меня не одна такая прога, в которой столбцы вылезают за края грида, и туда тоже со временем хотелось бы эту возможность добавить. А ширину столбцов не везде можно убавить.
junglecat (2015-01-25 18:59:00) [6]Ну я же не совсем тупой. Конечно, я твою ситуацию воспроизвел
duponamk (2015-01-25 18:55:00) [7]
> у меня такого не наблюдается. Что я делаю не так?
У тебя столбцы в гриде видны все? Если да - то таких косяков и не будет.
Попробуй сделать так, чтоб крайний столбец не был виден совсем и нужен был горизонтальный скроллинг грида. И после этого попробуй сделать сортировку по крайнему столбцу. У меня не идет.
junglecat (2015-01-25 18:41:00) [8]> Поставил 9.19.
> Проблема осталась.
у меня такого не наблюдается. Что я делаю не так?
duponamk (2015-01-25 18:07:00) [9]
> AlphaControls 2014 v9.19, TsDBGrid
> такой проблемы нету
Поставил 9.19.
Проблема осталась.
Зато выяснил еще одно: клик по частично видимому 5му столбцу - сортировка по данному столбцу происходит нормально. А по 6му (крайнему) - он невидим вообще (нужен горизонтальный скролл, чтобы его увидеть) - происходит обратный скролл и фиксируется нажатие на 4й столбец и соответственно этому идет сортировка (по 4му столбцу).
duponamk (2015-01-25 15:23:00) [10]
> AlphaControls 2014 v9.19, TsDBGrid
> такой проблемы нету
Проверю. У меня 9.18.
Inovet (2015-01-24 19:54:00) [11]> [23] duponamk © (24.01.15 14:10)
> PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(0)
Двойной клик на датасете может спасти ОРД.
junglecat (2015-01-24 16:43:00) [12]AlphaControls 2014 v9.19, TsDBGrid
такой проблемы нету
duponamk (2015-01-24 16:09:00) [13]
> и чем этот вариант принципиально отличается от того, что
> я в [5] предложил?
Может, и ничем. Тот вариант я тоже пробовал. Он нормально отрабатывает на первых 4х столбцах, которые помещаются в гриде. С 5-6м столбцами, которые находятся за пределами грида и чтобы добраться до них, нужен горизонтальный скроллинг грида - идет затыка с сортировкой. После скролла 5-6й столбцы доступны, можно нажать на заголовках этих столбцов. Вот только после нажатия идет обратный скролл и не фиксируется нажатие на последних столбцах. Уже проверено. Фиксируется нажатие на 3-4й столбцы и соответственно этому идет сортировка. Мне, собственно, это и надо победить.
junglecat (2015-01-24 14:19:00) [14]и чем этот вариант принципиально отличается от того, что я в [5] предложил?
junglecat (2015-01-24 14:17:00) [15]> ошибка: Accecc violation at address
тут отладчик нужен
что-то из PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber может быть nil
duponamk (2015-01-24 14:10:00) [16]
> Код давай.
...
IndexesList: array[0..5] of string;
...
//Запишем названия индексов в массив
IndexesList[0] := 'index_idx';
IndexesList[1] := 'opsname_idx';
IndexesList[2] := 'region_idx';
IndexesList[3] := 'autonom_idx';
IndexesList[4] := 'area_idx';
IndexesList[5] := 'city_idx';
...
procedure TPstIdxMainForm.GridTitleClick(Column: TColumn);
begin
//if f = datasetFIELD1 then dataset.IndexName := 'idx1';
//else if f = datasetFIELD2 then dataset.IndexName := 'idx2';
//else if f = datasetFIELD3 then dataset.IndexName := 'idx3';
PstIdxDat.Table1.Active := False;
if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(0) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[0]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(1) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[1]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(2) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[2]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(3) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[3]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(4) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[4]
else if Column.Field = PstIdxDat.Source1.DataSet.DataSetField.Fields.FieldByNumber(5) then
(PstIdxDat.Source1.Dataset as TABSTable).IndexName := IndexesList[5];
PstIdxDat.Table1.Active := True;
end;
Мог в чем-то напутать, т.к. при нажатии на произвольном столбце вылетает ошибка: Accecc violation at address... и т.д.
duponamk (2015-01-24 14:07:00) [17]
> а что за грид такой загадочный?
> с Rx таких проблем нету
>
> procedure TForm1.RxDBGrid1TitleClick(Column: TColumn);
> begin
> ADODataSet1.IndexFieldNames := Column.FieldName;
> end;
Грид из набора AlphaControls, о чем я писал в первом посте.
RxDBGrid не подходит, хоть он у меня и есть. Не то пальто.
ADO не использую - не нужен для программы.
junglecat (2015-01-24 13:41:00) [18]а что за грид такой загадочный?
с Rx таких проблем нету
procedure TForm1.RxDBGrid1TitleClick(Column: TColumn);
begin
ADODataSet1.IndexFieldNames := Column.FieldName;
end;
Плохиш (2015-01-24 00:21:00) [19]
> Код давай.
Испугаться хочешь?
Inovet (2015-01-23 18:30:00) [20]> [17] duponamk © (23.01.15 11:23)
> Вариант с датасетами.
Код давай.