#delphi #delphi-7 #tms #data-aware
#delphi #delphi-7 #tms #с учетом данных
Вопрос:
Я новичок в Delphi, и мне нужен совет.
Я использую TMS TDBAdvGrid, и мне нужно сортировать данные, когда пользователь нажимает на заголовок столбца. Я настраиваю параметры сортировки сетки и пишу код для события onclicksort, но это не работает.
Настройки сортировки сетки:
SortSettings.Show = True;
SortSettings.IgnoreBlanks = True;
SortSettings.BlankPos = blLast;
событие onclicksort:
try
try
if FSortISWorking then
Exit;
FSortISWorking := true;
if ACol < 0 then
begin
grid.BeginUpdate;
grid.SortSettings.Column := ACol;
Application.ProcessMessages;
grid.QSort;
grid.EndUpdate;
end;
except on e: Exception do
begin
// log the error
end;
end;
finally
FSortISWorking := false;
end;
Сетка не связана напрямую с базой данных. Данные загружены в память (TClientDataSet), и мне нужно отсортировать данные только в памяти, без другого запроса к базе данных.
Спасибо
Ответ №1:
Я попробовал ваш пример, и это решило проблему для меня:
Grid.PageMode := False;
Комментарии:
1. Спасибо. Это решение сработало. Единственная проблема заключается в том, что когда свойство равно false, соединение с набором данных закрывается.
2. При просмотре документации TMS кажется, что у вас не может быть обоих. Либо PageMode= True для редактирования данных, либо PageMode=False для сортировки. Вы можете найти более подробную информацию об этом в «TMS TDBAdvGrid.pdf», просто найдите «Режим страницы». Я также боролся с этим в прошлом, и мне пришлось прибегнуть к решению Radu — сортировать данные на уровне базы данных, чтобы данные все еще были доступны для редактирования :-/
Ответ №2:
Чтобы решить эту проблему, вы должны упорядочить набор данных за вашей сеткой. здесь у вас есть, как это сделать в general:http://delphi.about.com/od/usedbvcl/l/aa042203a.htm .
ниже приведен пример:
procedure TForm1.DBAdvGrid1CanSort(Sender:TObject; ACol: Integer; var DoSort: Boolean);
var fldname:string;
begin
DoSort := False; // disable internal sort
// toggle sort order if
dbadvgrid1.SortSettings.Direction = sdAscending then
dbadvgrid1.SortSettings.Direction := sdDescending else
dbadvgrid1.SortSettings.Direction := sdAscending;
// get field name of the column
clicked fldname :=query1.FieldList.Fields[ACol -1].FieldName;
if pos(' ',fldname) 0 then fldname:= 'biolife.db."' fldname '"';
// add ORDER BY clause to the query
query1.SQL.Text := 'select * from
biolife.db ORDER BY ' fldname;
if dbadvgrid1.SortSettings.Direction =
sdDescending then query1.SQL.Text :=
query1.SQL.Text ' DESC';
query1.Active := true;
DBAdvGrid1.SortSettings.Column := ACol;
end;
если вы хотите упорядочить свой clientdataset, здесь у вас есть, как это сделать:
http://edn.embarcadero.com/article/29056
с наилучшими пожеланиями,
Раду