Delphi7 TMS TDBAdvGrid сортирует данные при нажатии на заголовок столбца

#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

с наилучшими пожеланиями,
Раду