允许用户通过在单击按钮的tedit框中键入文本来搜索数据库表中的记录的最佳方法是什么,然后结果将显示在tcxgrid上。
我有一个tadquery / datasource正在查看包含各种字段的表。如果用户能够在表格中搜索多个字段,那就太好了。
感谢。
答案 0 :(得分:0)
您可以使用TDataSet.Locate
来传递分号分隔的字段名称列表和一组常量字段值以匹配。通常,这很容易:
DataSet.Locate('Field1;Field2', ['Value1', 'Value2'], [loPartialKey]);
但是,由于您事先并不知道有多少列,因此您需要使用VarArrayCreate
以不同的方式处理数组,并分别设置每个数组值。
此示例获取Edit1
的字段列表(以分号分隔),要匹配的Edit2
值列表(再次,以分号分隔,字符串值由{{1}包围}字符,因此它们被正确地包含在数组中)。它将'
的内容拆分为一个数组,以找出有多少元素,分配一个适当大小的变量数组,填充它,然后将字段列表和值数组传递给Edit1
。它已使用TDataSet.Locate
和Edit1.Text := 'Customer_No;Name';
进行了测试。
Edit2.Text := '1;''Smith''';
对于包含procedure TForm5.Button1Click(Sender: TObject);
var
Temp: string;
Fields: TArray<string>;
Vals: TArray<string>;
FieldValues: Variant;
i: Integer;
begin
// Grab a copy so we can split it into separate values
Temp := Edit1.Text;
Fields := Temp.Split([';']);
// Create the array of variants to hold the field values
FieldValues := VarArrayCreate([0, High(Fields)], VarVariant);
// Temporary copy to allow splitting into individual values
Temp := Edit2.Text;
Vals := Temp.Split([';']);
for i := 0 to High(Fields) do
FieldValues[i] := Vals[i];
// Use original field list from Edit1 for the Locate operation
DataSet1.Locate(Edit1.Text, FieldValues, [loCaseInsensitive]);
end;
之前的Delphi版本(例如您正在使用的XE2,只需将TStringHelper
和Types
添加到您的uses子句并使用{{1}而StrUtils
改为:
SplitString
答案 1 :(得分:0)
我会使用查询数据源和按钮的onclick事件,使用WHERE子句重新加载查询
Query1.SQL.Add('WHERE Name LIKE :P1 OR Postcode LIKE :P2 OR Town LIKE :P3');
并添加参数
Query1.SQL.Parameters.ParamByName('P1').Value := '%' + Edit1.Text + '%';
Query1.SQL.Parameters.ParamByName('P2').Value := '%' + Edit1.Text + '%';
Query1.SQL.Parameters.ParamByName('P3').Value := '%' + Edit1.Text + '%';
使用&#39;%&#39;允许在字符串中的任何位置搜索作为选项。
Query1.Open;
我多次使用过这种技术。