1.Three component e.g:dbgrideh of ehlib 2.instead of ListView 3.find forward question
用GRIDEH吧!!直接设置属性就可以啦!
简单的不考虑其他环境的做法: 再dbgrid.ontitleclick事件里写东西 with dbgrid1.datasource.dataset do begin indexfieldnames:=Column.FieldName; end; 这个要求dbgrid关联的是Ttable/ADO控件/TClientDataSet控件
转贴,其实像这样的帖子真的是已经很多了,楼主自己以后可以找找, 谁也不乐意总是回答自己见过的那几个问题,对吧? 给你一段基于C/S三层结构中的这段代码:通用过程 //===================================================================== procedure TfmAgentManager.GridTitleSort(Column: TColumn); var s,cFieldName:string; i:integer; DataSet:TDataSet; procedure setTitle; var ii:integer; cStr:string; c:TColumn; begin for ii:=0 to TDBGrid(Column.Grid).Columns.Count-1 do begin c:=TDBGrid(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; //=================================AdoDataSet===================== if DataSet is TCustomADODataSet then begin s:=TCustomADODataSet(DataSet).Sort; if s='' then begin s:=cFieldName; Column.Title.Caption:='▲'+Column.Title.Caption; 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.Title.Caption; end else begin Column.Title.Caption:='▲'+Column.Title.Caption; Delete(s,i,4); end; end else begin s:=cFieldName; Column.Title.Caption:='▲'+Column.Title.Caption; end; end; TCustomADODataSet(DataSet).Sort:=s; end //============================Clientdataset========================== else if DataSet is TClientDataSet then begin 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; end else begin TClientDataSet(DataSet).IndexName:=''; TClientDataSet(DataSet).IndexFieldNames:=column.fieldname; Column.Title.Caption:='▲'+Column.Title.Caption; end; end; end; //====================================================================== procedure TfmAgentManager.DBGrid1TitleClick(Column: TColumn); begin GridTitleSort(column); end;
2.instead of ListView
3.find forward question
再dbgrid.ontitleclick事件里写东西
with dbgrid1.datasource.dataset do
begin
indexfieldnames:=Column.FieldName;
end;
这个要求dbgrid关联的是Ttable/ADO控件/TClientDataSet控件
谁也不乐意总是回答自己见过的那几个问题,对吧?
给你一段基于C/S三层结构中的这段代码:通用过程
//=====================================================================
procedure TfmAgentManager.GridTitleSort(Column: TColumn);
var s,cFieldName:string;
i:integer;
DataSet:TDataSet;
procedure setTitle;
var ii:integer;
cStr:string;
c:TColumn;
begin
for ii:=0 to TDBGrid(Column.Grid).Columns.Count-1 do
begin
c:=TDBGrid(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;
//=================================AdoDataSet===================== if DataSet is TCustomADODataSet then begin
s:=TCustomADODataSet(DataSet).Sort;
if s='' then begin
s:=cFieldName;
Column.Title.Caption:='▲'+Column.Title.Caption;
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.Title.Caption;
end
else begin
Column.Title.Caption:='▲'+Column.Title.Caption;
Delete(s,i,4);
end;
end
else begin
s:=cFieldName;
Column.Title.Caption:='▲'+Column.Title.Caption;
end;
end;
TCustomADODataSet(DataSet).Sort:=s;
end
//============================Clientdataset==========================
else if DataSet is TClientDataSet then begin
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;
end
else
begin
TClientDataSet(DataSet).IndexName:='';
TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
Column.Title.Caption:='▲'+Column.Title.Caption;
end;
end;
end;
//======================================================================
procedure TfmAgentManager.DBGrid1TitleClick(Column: TColumn);
begin
GridTitleSort(column);
end;