2011-04-19 6 views
2

Я новичок в Delphi, и мне нужен совет.Delphi7 TMS TDBAdvGrid Сортировка данных при щелчке заголовка столбца

Я использую 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), и мне нужно сортировать данные только в памяти, без запроса в базу данных.

Спасибо

ответ

3

Я попробовал ваш пример, и это решило проблему для меня:

Grid.PageMode := False; 
+0

Спасибо. Это решение сработало. Единственная проблема заключается в том, что когда свойство является ложным, соединение с данным набором данных закрывается. – Andrei

+0

Заглядывая в документацию TMS, похоже, у вас не может быть обоих. Либо PageMode = True для редактирования данных, либо PageMode = False для сортировки. Вы можете найти более подробную информацию об этом в «TMS TDBAdvGrid.pdf», просто найдите «PageMode». Я также боролся с этим в прошлом и должен был пойти на решение Radu - сортировка данных на уровне базы данных, чтобы данные были доступны для редактирования: - / –

1

Для того, чтобы решить эту проблему, вы должны заказать набор данные за вашу сетку. здесь у вас есть, как это сделать в целом: 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

наилучшими пожеланиями,
Radu