//分是少点 嘿嘿!~~~~我用的是clientdataset 你修改成你用的dataset 我用的是bsSkinDBGrid 你修改成dbgrid procedure TGLBusinessMgr.aGridTitleSort(Column: TbsColumn); var s,cFieldName:string; i:integer; DataSet:TDataSet; procedure setTitle; var ii:integer; cStr:string; c:TbsColumn; begin for ii:=0 to TbsSkinDBGrid(Column.Grid).Columns.Count-1 do begin c:=TbsSkinDBGrid(Column.Grid).Columns[ii]; cStr:=c.Title.Caption; if (pos('▲',cStr)=1) or (pos('▼',cStr)=1) then begin Delete(cStr,1,2); c.Title.Caption:=cStr; end; end; end; begin setTitle; DataSet:=Column.Grid.DataSource.DataSet; if Column.Field.FieldKind=fkLookup then cFieldName:=Column.Field.KeyFields else if Column.Field.FieldKind=fkCalculated then cFieldName:=Column.Field.KeyFields else cFieldName:=Column.FieldName; if DataSet is TCustomADODataSet then begin s:=TCustomADODataSet(DataSet).Sort; if s='' then begin s:=cFieldName; Column.Title.Caption:='▲'+Column.Field.DisplayName; end else begin if Pos(cFieldName,s)<>0 then begin i:=Pos('DESC',s); if i<=0 then begin s:=s+' DESC'; Column.Title.Caption:='▼'+Column.Field.DisplayName; end else begin Column.Title.Caption:='▲'+Column.Field.DisplayName; Delete(s,i,4); end; end else begin s:=cFieldName; Column.Title.Caption:='▲'+Column.Field.DisplayName; end; end; TCustomADODataSet(DataSet).Sort:=s; end else if DataSet is TClientDataSet then begin // TClientDataSet(DataSet).IndexFieldNames:=Column.FieldName; ///////////////////////// if TClientDataSet(DataSet).indexfieldnames<>'' then begin i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName); if i=-1 then begin with TClientDataSet(DataSet).IndexDefs.AddIndexDef do begin Name:='i'+Column.FieldName; Fields:=Column.FieldName; DescFields:=Column.FieldName; end; end; TClientDataSet(DataSet).IndexFieldNames:=''; TClientDataSet(DataSet).IndexName:='i'+Column.FieldName; Column.Title.Caption:='▼'+Column.Title.Caption;//.Field.DisplayName; end else begin TClientDataSet(DataSet).IndexName:=''; TClientDataSet(DataSet).IndexFieldNames:=column.fieldname; Column.Title.Caption:='▲'+Column.Title.Caption;//.Field.DisplayName; end; //////////////////// end;end;
procedure TDbGridUFrm.DBGrid_DataTitleClick(Column: TColumn); var i: Integer; begin i := Column.Index; try if (Column.Field.DataSet As TADODataSet).Sort <> DBGrid_Data.Columns[i].FieldName + ' ASC' then (Column.Field.DataSet As TADODataSet).Sort := DBGrid_Data.Columns[i].FieldName + ' ASC' else (Column.Field.DataSet As TADODataSet).Sort := DBGrid_Data.Columns[i].FieldName + ' DESC'; except Exit; end; end;至于要加▲,你根据代码来写就可以了。
建议: type TDbGridUFrm = class(TFrame) 再用TDbGridUFrm,你的所有dbgrid都具有排序功能。 但是有个问题:查询字段的数据无法正常的排序,除非你从dataSet的数据角度来处理。
因为某些事耽搁而把这个问题放下几天了。今天试了一下,还是不行。procedure TFrm_Searchdb.DBGrid1TitleClick(Column: TColumn); var fieldname: string; i: integer; begin i := Column.Index; fieldname := DBGrid1.Columns[i].FieldName +'DESC'; DM_Main.AQuery.Sort := fieldname; end; 当运行到DM_Main.AQuery.Sort := fieldname;这里时弹出“项目在所需的名称或序数中未被发现”。 是不是因为我查询出来的AQuery的数据是从两个表中select的原因?
搞掂了,原来是自己粗心,'DESC'和'ASC'里少了个空格, 应该为:' DESC'和' ASC'。先定义全局变量: SortStyle :boolean; procedure TFrm_Search.DBGrid1TitleClick(Column: TColumn); begin if SortStyle = false then begin DM_Main.AQuery.Sort := Column.FieldName+' ASC'; SortStyle :=true; end else begin DM_Main.AQuery.Sort := Column.FieldName+' DESC'; SortStyle :=false; end; end;
procedure TfrmvipDA.DBGridEh1TitleClick(Column: TColumnEh); var fieldname:string; begin case Column.Index of 0: begin if bSort then//这里可以定义一个Boolean型的变量来控制 begin fieldname := 'kh ASC'; bSort := False; end else begin fieldname :='Kh DESC'; bSort := True; end; ADOQitem.Sort :=fieldname; end; 1: begin if bSort then begin fieldname := 'fkrq ASC'; bSort := False; end else begin fieldname :='fkrq DESC'; bSort := True; end; ADOQitem.Sort :=fieldname; end; 2: begin if bSort then begin fieldname := 'zkrq ASC'; bSort := False; end else begin fieldname :='zkrq DESC'; bSort := True; end; ADOQitem.Sort :=fieldname; end; 3: begin if bSort then begin fieldname:='yje ASC'; bSort :=False; end else begin fieldname :='yje DESC'; bSort :=True; end; ADOQitem.Sort :=fieldname; end; 4: begin if bSort then begin fieldname:='je ASC'; bSort :=False; end else begin fieldname :='je DESC'; bSort :=True; end; ADOQitem.Sort :=fieldname; end; 5: begin if bSort then begin fieldname:='yjf ASC'; bSort :=False; end else begin fieldname :='yjf DESC'; bSort :=True; end; ADOQitem.Sort :=fieldname; end; 6: begin if bSort then begin fieldname:='jf ASC'; bSort :=False; end else begin fieldname :='jf DESC'; bSort :=True; end; ADOQitem.Sort :=fieldname; end; 8: begin if bSort then begin fieldname:=' ASC'; bSort :=False; end else begin fieldname :=' DESC'; bSort :=True; end; ADOQitem.Sort :=fieldname; end; 12: begin if bSort then begin fieldname :='yhmc ASC'; bSort :=false; end else begin fieldname:='yhmc DESC'; bSort :=True; end; ADOQitem.Sort :=fieldname end; end; end;
嘿嘿!~~~~我用的是clientdataset 你修改成你用的dataset
我用的是bsSkinDBGrid 你修改成dbgrid
procedure TGLBusinessMgr.aGridTitleSort(Column: TbsColumn);
var s,cFieldName:string;
i:integer;
DataSet:TDataSet;
procedure setTitle;
var ii:integer;
cStr:string;
c:TbsColumn;
begin
for ii:=0 to TbsSkinDBGrid(Column.Grid).Columns.Count-1 do
begin
c:=TbsSkinDBGrid(Column.Grid).Columns[ii];
cStr:=c.Title.Caption;
if (pos('▲',cStr)=1) or (pos('▼',cStr)=1) then begin
Delete(cStr,1,2);
c.Title.Caption:=cStr;
end;
end;
end;
begin
setTitle;
DataSet:=Column.Grid.DataSource.DataSet;
if Column.Field.FieldKind=fkLookup then
cFieldName:=Column.Field.KeyFields
else if Column.Field.FieldKind=fkCalculated then
cFieldName:=Column.Field.KeyFields
else
cFieldName:=Column.FieldName;
if DataSet is TCustomADODataSet then begin
s:=TCustomADODataSet(DataSet).Sort;
if s='' then begin
s:=cFieldName;
Column.Title.Caption:='▲'+Column.Field.DisplayName;
end
else begin
if Pos(cFieldName,s)<>0 then begin
i:=Pos('DESC',s);
if i<=0 then begin
s:=s+' DESC';
Column.Title.Caption:='▼'+Column.Field.DisplayName;
end
else begin
Column.Title.Caption:='▲'+Column.Field.DisplayName;
Delete(s,i,4);
end;
end
else begin
s:=cFieldName;
Column.Title.Caption:='▲'+Column.Field.DisplayName;
end;
end;
TCustomADODataSet(DataSet).Sort:=s;
end
else if DataSet is TClientDataSet then begin
// TClientDataSet(DataSet).IndexFieldNames:=Column.FieldName;
/////////////////////////
if TClientDataSet(DataSet).indexfieldnames<>'' then
begin
i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName);
if i=-1 then
begin
with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
begin
Name:='i'+Column.FieldName;
Fields:=Column.FieldName;
DescFields:=Column.FieldName;
end;
end;
TClientDataSet(DataSet).IndexFieldNames:='';
TClientDataSet(DataSet).IndexName:='i'+Column.FieldName;
Column.Title.Caption:='▼'+Column.Title.Caption;//.Field.DisplayName;
end
else
begin
TClientDataSet(DataSet).IndexName:='';
TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
Column.Title.Caption:='▲'+Column.Title.Caption;//.Field.DisplayName;
end;
////////////////////
end;end;
var
i: Integer;
begin
i := Column.Index;
try
if (Column.Field.DataSet As TADODataSet).Sort <> DBGrid_Data.Columns[i].FieldName + ' ASC' then
(Column.Field.DataSet As TADODataSet).Sort := DBGrid_Data.Columns[i].FieldName + ' ASC'
else
(Column.Field.DataSet As TADODataSet).Sort := DBGrid_Data.Columns[i].FieldName + ' DESC';
except
Exit;
end;
end;至于要加▲,你根据代码来写就可以了。
type
TDbGridUFrm = class(TFrame)
再用TDbGridUFrm,你的所有dbgrid都具有排序功能。
但是有个问题:查询字段的数据无法正常的排序,除非你从dataSet的数据角度来处理。
var
fieldname: string;
i: integer;
begin
i := Column.Index;
fieldname := DBGrid1.Columns[i].FieldName +'DESC';
DM_Main.AQuery.Sort := fieldname;
end;
当运行到DM_Main.AQuery.Sort := fieldname;这里时弹出“项目在所需的名称或序数中未被发现”。
是不是因为我查询出来的AQuery的数据是从两个表中select的原因?
应该为:' DESC'和' ASC'。先定义全局变量: SortStyle :boolean;
procedure TFrm_Search.DBGrid1TitleClick(Column: TColumn);
begin
if SortStyle = false then
begin
DM_Main.AQuery.Sort := Column.FieldName+' ASC';
SortStyle :=true;
end
else
begin
DM_Main.AQuery.Sort := Column.FieldName+' DESC';
SortStyle :=false;
end;
end;
var
fieldname:string;
begin
case Column.Index of
0:
begin
if bSort then//这里可以定义一个Boolean型的变量来控制
begin
fieldname := 'kh ASC';
bSort := False;
end
else
begin
fieldname :='Kh DESC';
bSort := True;
end;
ADOQitem.Sort :=fieldname;
end;
1:
begin
if bSort then
begin
fieldname := 'fkrq ASC';
bSort := False;
end
else
begin
fieldname :='fkrq DESC';
bSort := True;
end;
ADOQitem.Sort :=fieldname;
end;
2:
begin
if bSort then
begin
fieldname := 'zkrq ASC';
bSort := False;
end
else
begin
fieldname :='zkrq DESC';
bSort := True;
end;
ADOQitem.Sort :=fieldname;
end;
3:
begin
if bSort then
begin
fieldname:='yje ASC';
bSort :=False;
end
else
begin
fieldname :='yje DESC';
bSort :=True;
end;
ADOQitem.Sort :=fieldname;
end;
4:
begin
if bSort then
begin
fieldname:='je ASC';
bSort :=False;
end
else
begin
fieldname :='je DESC';
bSort :=True;
end;
ADOQitem.Sort :=fieldname;
end;
5:
begin
if bSort then
begin
fieldname:='yjf ASC';
bSort :=False;
end
else
begin
fieldname :='yjf DESC';
bSort :=True;
end;
ADOQitem.Sort :=fieldname;
end;
6:
begin
if bSort then
begin
fieldname:='jf ASC';
bSort :=False;
end
else
begin
fieldname :='jf DESC';
bSort :=True;
end;
ADOQitem.Sort :=fieldname;
end;
8:
begin
if bSort then
begin
fieldname:=' ASC';
bSort :=False;
end
else
begin
fieldname :=' DESC';
bSort :=True;
end;
ADOQitem.Sort :=fieldname;
end;
12:
begin
if bSort then
begin
fieldname :='yhmc ASC';
bSort :=false;
end
else
begin
fieldname:='yhmc DESC';
bSort :=True;
end;
ADOQitem.Sort :=fieldname
end;
end;
end;