首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全域TDataset.Locate

全域TDataset.Locate
EN

Stack Overflow用户
提问于 2021-09-23 17:35:43
回答 1查看 218关注 0票数 0

假设我们有一个包含5个字段的数据集,显示在一个DBGrid中。

用户希望在网格中的任何地方找到文本。

如果我想通过所有字段进行搜索,或者必须实现自定义代码来实现这一点,那么是否有任何方法可以使用TDataset.Locate()方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-23 18:31:12

简单地说,您需要一些自定义代码,因为当您使用多个字段调用Locate时,您必须传递一个包含要在相应字段中匹配的值的变体数组。虽然可以指定匹配可以基于部分键(字段)值,但要匹配的模式不能跨越多个字段。

幸运的是,有一种简单的方法可以实现您想要的结果,如下所示:

  1. 将计算出的FieldKind fkInternalCalc字符串字段添加到数据集中,我们称之为AllFields.

dataset的

  1. 将AllField的值设置为数据集所有其他字段的AsString值的连接;

  1. 调用定位到AllFields字段,代码如下

如果MyDataSet.Locate('AllFields',AValue,loPartialKey)那么;

这就是你所需要的。

示例

代码语言:javascript
复制
type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    MyDataSet: TClientDataSet;
    DataSource1: TDataSource;
    Button1: TButton;
    DBNavigator1: TDBNavigator;
    edSearch: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure MyDataSetCalcFields(DataSet: TDataSet);
    procedure edSearchChange(Sender: TObject);
  end;

[...]

procedure TForm1.FormCreate(Sender: TObject);
var
  AField : TField;
  i : Integer;
begin
  AField := TIntegerField.Create(Self);
  AField.FieldName := 'ID';
  AField.DataSet := MyDataSet;

  AField := TStringField.Create(Self);
  AField.FieldName := 'FieldA';
  AField.DataSet := MyDataSet;

  AField := TStringField.Create(Self);
  AField.FieldName := 'FieldB';
  AField.DataSet := MyDataSet;

  AField := TStringField.Create(Self);
  AField.FieldName := 'FieldC';
  AField.DataSet := MyDataSet;

  AField := TStringField.Create(Self);
  AField.FieldName := 'FieldD';
  AField.DataSet := MyDataSet;

  AField := TStringField.Create(Self);
  AField.FieldName := 'AllFields';
  AField.Size := 255;  //  increase if necessary
  AField.FieldKind := fkInternalCalc;  //  not fkCalculated
  AField.DataSet := MyDataSet;

  MyDataSet.CreateDataSet;

  for i := 1 to 100 do begin
    MyDataSet.InsertRecord([i, 'value'+ IntToStr(i), 'value'+ IntToStr(i), 'value'+ IntToStr(i), 'value'+ IntToStr(i)]);
  end;
end;

procedure TForm1.MyDataSetCalcFields(DataSet: TDataSet);
var
  S : String;
  i : Integer;
begin
  S := '';
  for i := 0 to DataSet.FieldCount - 2 do  //  the 2 is to stop the loop before the AllFields filed
    S := S + DataSet.Fields[i].AsString;

  DataSet.Fields[5].AsString := S; //  AllField is field 5
end;

procedure TForm1.edSearchChange(Sender: TObject);
begin
  if edSearch.Text <>'' then
    MyDataSet.Locate('AllFields', edSearch.Text, [loPartialKey, loCaseInsensitive])
  else
    MyDataSet.First;
end;

注意:要使上面的代码工作,MyDataSet的dataset类型需要是支持fkInternalCalc字段类型的类型,比如TClientDataSet。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69304589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档