ClientDataSet排序

procedure TDM1.DsSort(SortColumn: TColumnEh);
var
OldIndex:string;
begin
if (SortColumn.Grid.DataSource=nil) or (SortColumn.Grid.DataSource.DataSet=nil) or (not SortColumn.Grid.DataSource.DataSet.Active) then Exit;
OldIndex:=TClientDataSet(SortColumn.Field.DataSet).IndexName;
if OldIndex<>'' then
begin
TClientDataSet(SortColumn.Field.DataSet).IndexName:='';
TClientDataSet(SortColumn.Field.DataSet).DeleteIndex(OldIndex);
end;
case SortColumn.Title.SortMarker of
smNoneEh,
smUpEh :TClientDataSet(SortColumn.Field.DataSet).AddIndex('px',SortColumn.Field.FieldName,[ixDescending]);
smDownEh:TClientDataSet(SortColumn.Field.DataSet).AddIndex('px',SortColumn.Field.FieldName,[ixPrimary]);
end;
TClientDataSet(SortColumn.Field.DataSet).IndexName:='px';
end; 


2003-11-5 12:19:59 把上面的过程稍做修改,可用于标准DBGridvar
ASC:Boolean=True;//是否升序排列
procedure TDM1.DsSort(SortColumn: TColumn);
var
OldIndex:string;
begin
if (SortColumn.Grid.DataSource=nil) or (SortColumn.Grid.DataSource.DataSet=nil) or (not SortColumn.Grid.DataSource.DataSet.Active) then Exit;
OldIndex:=TClientDataSet(SortColumn.Field.DataSet).IndexName;
if OldIndex<>'' then
begin
TClientDataSet(SortColumn.Field.DataSet).IndexName:='';
TClientDataSet(SortColumn.Field.DataSet).DeleteIndex(OldIndex);
end;
case ASC of
Ture :TClientDataSet(SortColumn.Field.DataSet).AddIndex('px',SortColumn.Field.FieldName,[ixDescending]);//已经是升序就按降序排列
else//否则按升序排列
TClientDataSet(SortColumn.Field.DataSet).AddIndex('px',SortColumn.Field.FieldName,[ixPrimary]);
end;{end case}
TClientDataSet(SortColumn.Field.DataSet).IndexName:='px';
ASC:=not ASC;
end; 

//以下由 Gkrong 整理完成
//DBGridEh点击标题排序
procedure DBGridEhTitleSort(Column: TColumnEh);
var
DataSet: TClientDataSet;
cFieldName: string;
begin
if (Column.Grid.DataSource = nil) or (Column.Grid.DataSource.DataSet = nil)
or Column.Grid.DataSource.DataSet.IsEmpty or not(Column.Field.DataSet is TClientDataSet) then Exit;
DataSet := TClientDataSet(Column.Field.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.IndexFieldNames <> '' then
begin
if DataSet.IndexDefs.IndexOf('i' + cFieldName) = -1 then
begin
with DataSet.IndexDefs.AddIndexDef do
begin
Name := 'i' + cFieldName;
Fields := cFieldName;
DescFields := cFieldName;
end;
end;
DataSet.IndexFieldNames := '';
DataSet.IndexName := 'i' + cFieldName;
Column.Title.SortMarker := smDownEh;
end
else
begin
DataSet.IndexName := '';
DataSet.IndexFieldNames := cFieldName;
Column.Title.SortMarker := smUpEh;
end;
end;

//根据点击 DBGridEh 标头先后顺序排序,须在调用窗口上定义两个字符串保存排序字段及降序字段
//创建索引后如果关闭数据集再重新打开会报找不到索引的错误,须在打开前 TClientDataSet.IndexName := '';
procedure DBGridEhOrderSort(Column: TColumnEh; var sFields, sDescFields: string);
var
sIndexName, sFieldName: string;
cdsDataSet: TClientDataSet;
begin
if (Column.Grid.DataSource = nil) or (Column.Grid.DataSource.DataSet = nil)
or Column.Grid.DataSource.DataSet.IsEmpty or not(Column.Field.DataSet is TClientDataSet) then Exit;
if (Column.Field.FieldKind = fkLookup) or (Column.Field.FieldKind = fkCalculated) then
sFieldName := Column.Field.KeyFields
else sFieldName := Column.FieldName;
cdsDataSet := TClientDataSet(Column.Field.DataSet);
sIndexName := cdsDataSet.IndexName;
if sIndexName <> '' then cdsDataSet.DeleteIndex(sIndexName)
else sIndexName := 'Gkrong';
if sFieldName = '' then
begin
if Column.Title.SortMarker <> smDownEh then
Column.Title.SortMarker := smDownEh
else Column.Title.SortMarker := smUpEh;
cdsDataSet.IndexName := '';
end
else
begin
if (Pos(sFieldName, sFields) = 0) or (Pos(sFieldName, sDescFields) > 0) then
begin
Column.Title.SortMarker := smUpEh;
sFields := AppItem(sFields, sFieldName);
sDescFields := DelItem(sDescFields, sFieldName);
if sDescFields = '' then
cdsDataSet.AddIndex(sIndexName, sFields, [ixPrimary])
else
cdsDataSet.AddIndex(sIndexName, sFields, [ixDescending], sDescFields);
end
else
begin
Column.Title.SortMarker := smDownEh;
sFields := AppItem(sFields, sFieldName);
sDescFields := AppItem(sDescFields, sFieldName);
cdsDataSet.AddIndex(sIndexName, sFields, [ixDescending], sDescFields);
end;
cdsDataSet.IndexName := sIndexName;
end;
end;

//删除指定字段串中的子串
function DelItem(Dest, Item: string): string;
begin
if Pos(Item+';', Dest) > 0 then
Result := AnsiReplaceStr(Dest, Item+';', '')
else if Pos(';'+Item, Dest) > 0 then
Result := AnsiReplaceStr(Dest, ';'+Item, '')
else if Pos(Item, Dest) > 0 then
Result := AnsiReplaceStr(Dest, Item, '');
end;

//向指定字符串中增加子串
function AppItem(Dest, Item: string): string;
begin
if Pos(Item+';', Dest) > 0 then
Result := Item + ';' + AnsiReplaceStr(Dest, Item+';', '')
else if Pos(';'+Item, Dest) > 0 then
Result := Item + ';' + AnsiReplaceStr(Dest, ';'+Item, '')
else if (Pos(Item, Dest) = 0) and (Length(Dest) > 0) then
Result := Item + ';' + Dest
else
Result := Item;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值