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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Delphi中,DBGridEh是一个非常常用的数据表格控件,它可以用于显示和编辑数据库中的数据。而LookupDisplay是DBGridEh中的一个属性,用于提供表格中关联表字段的显示值。 通常情况下,DBGridEh的LookupDisplay属性用于显示关联字段的显示值,该值将从关联表中获取。在使用DBGridEh时,需要使用ClientDataSet组件来提供数据。ClientDataSet是一种内存数据集,可以在客户端应用程序中存储和处理数据。 要在DBGridEh中使用LookupDisplay属性,首先需要在ClientDataSet中定义关联字段。关联字段是指与主表的某个字段关联的从表的字段。在ClientDataSet的字段编辑器中,可以通过设置LookupDataset、LookupKeyFields和LookupResultField属性来定义关联字段。 LookupDataset属性用于指定从表所在的ClientDataSet组件,LookupKeyFields属性是用来指定主表与从表关联的字段名,LookupResultField属性则是用来指定从表中要显示的字段名。 然后,在DBGridEh的Columns属性中找到需要显示关联字段的列,将这些列的LookupDisplay属性设置为True。这样,DBGridEh将会自动从关联表中获取相应的显示值,并在表格中显示出来。 总的来说,使用Delphi中的DBGridEh和ClientDataSet组件,可以很方便地实现表格中两列的LookupDisplay功能,即从关联表中获取显示值并显示在表格中,提供更友好的用户界面和数据交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值