参考一下我的代码: procedure Tmoduleform.DBGrid1TitleClick(Column: TColumn); begin if clientdataset1.IsEmpty then exit; clientdataset1.DisableControls; if indexname='降序' then //按升序排列 begin if clientdataset1.IndexName='Indexname' then clientdataset1.DeleteIndex('Indexname'); clientdataset1.AddIndex('Indexname',column.FieldName,[],column.FieldName,'',0); ClientDataSet1.IndexName:='Indexname'; indexname:='升序'; end else //按降序排列 begin if clientdataset1.IndexName='Indexname' then clientdataset1.DeleteIndex('Indexname'); clientdataset1.AddIndex('Indexname',column.FieldName,[],'','',0); ClientDataSet1.IndexName:='Indexname'; indexname:='降序'; end; clientdataset1.EnableControls; isenabled; showstate; end;
**********抢分行动*********** 碰到问题查不到,花了半天时间作了一个,不敢独享。 ADO类的数据集有Sort,但是TClientDataSet没有,故作。procedure SortCDS(Column:TColumn); function FindColumn(Grid:TDbGrid;Name:string):TColumn; var i:integer; begin Result:=nil; for i:=0 to Grid.Columns.Count-1 do if Grid.Columns.Items[i].FieldName=Name then Result:=Grid.Columns.Items[i]; end; var DataSet:TClientDataSet; ASC:boolean; Clm:TColumn; begin DataSet:=TClientDataSet(Column.Field.DataSet); if Assigned(DataSet) and (not DataSet.IsEmpty) then begin if DataSet.IndexName=Column.Fieldname then ASC:=StrPos(PChar(Column.Title.Caption),'▼')<>nil; Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName); if Assigned(Clm) then begin DataSet.DeleteIndex(DataSet.IndexName); Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2); end; if Asc then begin DataSet.AddIndex(Column.Fieldname,Column.FieldName, [ixCaseInsensitive,ixDescending]); Column.Title.Caption:=Column.Title.Caption+'▲'; end else begin DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixCaseInsensitive]); Column.Title.Caption:=Column.Title.Caption+'▼'; end; DataSet.IndexName:=Column.Fieldname; end; end;
就是点击价表时。可以按价格的大小进行排序。不是可否。
如果行的话考过去参考吧。
dbgrid中标题点击的事件。
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:= 'select * from MainTable order by+"'+ Column.FieldName +'"';
ADOQuery1.Open;
end;
procedure Tmoduleform.DBGrid1TitleClick(Column: TColumn);
begin
if clientdataset1.IsEmpty then
exit;
clientdataset1.DisableControls;
if indexname='降序' then //按升序排列
begin
if clientdataset1.IndexName='Indexname' then
clientdataset1.DeleteIndex('Indexname');
clientdataset1.AddIndex('Indexname',column.FieldName,[],column.FieldName,'',0);
ClientDataSet1.IndexName:='Indexname';
indexname:='升序';
end
else //按降序排列
begin
if clientdataset1.IndexName='Indexname' then
clientdataset1.DeleteIndex('Indexname');
clientdataset1.AddIndex('Indexname',column.FieldName,[],'','',0);
ClientDataSet1.IndexName:='Indexname';
indexname:='降序';
end;
clientdataset1.EnableControls;
isenabled;
showstate;
end;
碰到问题查不到,花了半天时间作了一个,不敢独享。
ADO类的数据集有Sort,但是TClientDataSet没有,故作。procedure SortCDS(Column:TColumn);
function FindColumn(Grid:TDbGrid;Name:string):TColumn;
var
i:integer;
begin
Result:=nil;
for i:=0 to Grid.Columns.Count-1 do
if Grid.Columns.Items[i].FieldName=Name then
Result:=Grid.Columns.Items[i];
end;
var
DataSet:TClientDataSet;
ASC:boolean;
Clm:TColumn;
begin
DataSet:=TClientDataSet(Column.Field.DataSet);
if Assigned(DataSet) and (not DataSet.IsEmpty) then
begin
if DataSet.IndexName=Column.Fieldname then
ASC:=StrPos(PChar(Column.Title.Caption),'▼')<>nil;
Clm:=FindColumn(TDbGrid(Column.Grid),DataSet.IndexName);
if Assigned(Clm) then
begin
DataSet.DeleteIndex(DataSet.IndexName);
Clm.Title.Caption:=Copy(Clm.Title.Caption,1,Length(Clm.Title.Caption)-2);
end;
if Asc then
begin
DataSet.AddIndex(Column.Fieldname,Column.FieldName,
[ixCaseInsensitive,ixDescending]);
Column.Title.Caption:=Column.Title.Caption+'▲';
end
else begin
DataSet.AddIndex(Column.Fieldname,Column.FieldName,[ixCaseInsensitive]);
Column.Title.Caption:=Column.Title.Caption+'▼';
end;
DataSet.IndexName:=Column.Fieldname;
end;
end;