http://borland.mblogger.cn/aiirii/posts/4846.aspxprocedure TDmMain.SetCdsIndexName(cds: TClientDataSet; ColumnFieldName: string); var lIndexName: string; begin inherited; if not cds.Active then Exit; if cds.FieldByName(ColumnFieldName).FieldKind <> fkData then begin if cds.FieldByName(ColumnFieldName).FieldKind = fkLookup then ColumnFieldName := cds.FieldByName(ColumnFieldName).KeyFields else exit; end; lIndexName := cds.IndexName; if lIndexName <> '' then cds.DeleteIndex(lIndexName); if AnsiContainsText(lIndexName, ColumnFieldName) then begin if AnsiContainsText(lIndexName, 'desc') then begin lIndexName := ColumnFieldName; cds.AddIndex(lIndexName, ColumnFieldName, []); end else lIndexName := ''; end else begin lIndexName := ColumnFieldName + ' desc'; cds.AddIndex(lIndexName, ColumnFieldName, [ixDescending]); end; cds.IndexName := lIndexName; end;
procedure TFrmKeyWordMsgQry.grdKeyWordMsgTitleClick(Column: TColumn); begin DBGridSort(grdKeywordMsg,Column); end;
procedure DBGridSort(ADBGrid:TDBGrid;Column:TColumn); var iFieldCount : integer; iLen : integer; StrCaption : string; StrSort : string; TheColumn : TColumn; Str : string; begin if (ADBGrid.DataSource.DataSet as TADOQuery).Active then begin if (ADBGrid.DataSource.DataSet as TADOQuery).RecordCount = 0 then Exit; { //去掉以前的Order字句 StrSQL := ADOQuery1.SQL.Text; iPos := Pos('order',StrSQL); if iPos>0 then StrSQL := Copy(StrSQL,1,iPos-1); } end else Exit; StrSort:=''; Str :=''; // 遍历表格字段, 初始化Title标题,并取得StrSort for iFieldCount := 0 to ADBGrid.Columns.Count - 1 do begin TheColumn := ADBGrid.Columns[iFieldCount]; StrCaption := TheColumn.Title.Caption; iLen := Length(StrCaption);
//如果当前Column=TheColumn if TheColumn=Column then begin //遇到不可排序字段,则继续 case TheColumn.Field.DataType of ftBoolean, ftBytes, ftBlob, //Binary ftMemo, ftGraphic, ftFmtMemo, //Formatted memo ftParadoxOle: begin MessageBox('此字段为不可排序字段!',mtWarning,btOK); Continue; end; end; Str :=Copy(StrCaption,iLen-1,2); //如果为'',则显示' ▲' if (Pos('▲',StrCaption)=0) and (Pos('▼',StrCaption)=0) then begin StrSort := StrSort+TheColumn.FieldName+' ASC,'; TheColumn.Title.Caption := StrCaption+'▲'; end else begin //如果为'▼',则显示'' if ( Str = '▼') then begin StrSort := StrSort+''; TheColumn.Title.Caption := Copy(StrCaption,1,iLen-2) end; //如果为'▲',则显示' ▼' if ( Str = '▲') then begin StrSort := StrSort+TheColumn.FieldName+' DESC,'; TheColumn.Title.Caption:=Copy(StrCaption,1,iLen-2)+'▼'; end; end; end else begin Str :=Copy(StrCaption,iLen-1,2); //如果为'',不做响应 if (Pos('▲',StrCaption)=0) and (Pos('▼',StrCaption)=0) then begin // end else begin //如果为'▼',降序 if ( Str = '▼') then StrSort := StrSort+TheColumn.FieldName+' DESC,'; //如果为'▲' ,升序 if ( Str = '▲') then StrSort := StrSort+TheColumn.FieldName+' ASC,'; end; end; end; //去掉最后一个',' StrSort := Copy(StrSort,1,Length(StrSort)-1); //ShowMessage(StrSort); (ADBGrid.DataSource.DataSet as TADOQuery).Sort := StrSort; end;
cds.IndexName := lIndexName;
ColumnFieldName: string);
var
lIndexName: string;
begin
inherited;
if not cds.Active then Exit;
if cds.FieldByName(ColumnFieldName).FieldKind <> fkData then
begin
if cds.FieldByName(ColumnFieldName).FieldKind = fkLookup then
ColumnFieldName := cds.FieldByName(ColumnFieldName).KeyFields
else
exit;
end;
lIndexName := cds.IndexName;
if lIndexName <> '' then
cds.DeleteIndex(lIndexName);
if AnsiContainsText(lIndexName, ColumnFieldName) then
begin
if AnsiContainsText(lIndexName, 'desc') then
begin
lIndexName := ColumnFieldName;
cds.AddIndex(lIndexName, ColumnFieldName, []);
end
else
lIndexName := '';
end
else
begin
lIndexName := ColumnFieldName + ' desc';
cds.AddIndex(lIndexName, ColumnFieldName, [ixDescending]);
end;
cds.IndexName := lIndexName;
end;
begin
DBGridSort(grdKeywordMsg,Column);
end;
var
iFieldCount : integer;
iLen : integer;
StrCaption : string;
StrSort : string;
TheColumn : TColumn;
Str : string;
begin
if (ADBGrid.DataSource.DataSet as TADOQuery).Active then
begin
if (ADBGrid.DataSource.DataSet as TADOQuery).RecordCount = 0 then Exit;
{
//去掉以前的Order字句
StrSQL := ADOQuery1.SQL.Text;
iPos := Pos('order',StrSQL);
if iPos>0 then StrSQL := Copy(StrSQL,1,iPos-1);
}
end
else
Exit; StrSort:='';
Str :=''; // 遍历表格字段, 初始化Title标题,并取得StrSort
for iFieldCount := 0 to ADBGrid.Columns.Count - 1 do
begin
TheColumn := ADBGrid.Columns[iFieldCount];
StrCaption := TheColumn.Title.Caption;
iLen := Length(StrCaption);
//如果当前Column=TheColumn
if TheColumn=Column then
begin
//遇到不可排序字段,则继续
case TheColumn.Field.DataType of
ftBoolean,
ftBytes,
ftBlob, //Binary
ftMemo,
ftGraphic,
ftFmtMemo, //Formatted memo
ftParadoxOle:
begin
MessageBox('此字段为不可排序字段!',mtWarning,btOK);
Continue;
end;
end;
Str :=Copy(StrCaption,iLen-1,2);
//如果为'',则显示' ▲'
if (Pos('▲',StrCaption)=0) and (Pos('▼',StrCaption)=0) then
begin
StrSort := StrSort+TheColumn.FieldName+' ASC,';
TheColumn.Title.Caption := StrCaption+'▲';
end
else begin
//如果为'▼',则显示''
if ( Str = '▼') then
begin
StrSort := StrSort+'';
TheColumn.Title.Caption := Copy(StrCaption,1,iLen-2)
end;
//如果为'▲',则显示' ▼'
if ( Str = '▲') then
begin
StrSort := StrSort+TheColumn.FieldName+' DESC,';
TheColumn.Title.Caption:=Copy(StrCaption,1,iLen-2)+'▼';
end;
end;
end
else begin
Str :=Copy(StrCaption,iLen-1,2);
//如果为'',不做响应
if (Pos('▲',StrCaption)=0) and (Pos('▼',StrCaption)=0) then
begin
//
end
else begin
//如果为'▼',降序
if ( Str = '▼') then StrSort := StrSort+TheColumn.FieldName+' DESC,';
//如果为'▲' ,升序
if ( Str = '▲') then StrSort := StrSort+TheColumn.FieldName+' ASC,';
end;
end;
end; //去掉最后一个','
StrSort := Copy(StrSort,1,Length(StrSort)-1);
//ShowMessage(StrSort);
(ADBGrid.DataSource.DataSet as TADOQuery).Sort := StrSort;
end;
你可以将其中的as TADOQuery 换成as TClientDataSet试一试
你上面的方法制只能适用于ADO。在dbexpress中,一般的动态排序,就该象一楼说的,AddIndex或者考虑定义添加动态索引在IndexDefs
和IndexName中.小弟拙见