DBGrid没有afterscroll事件吧!可以这样。 var FilterFieldName:string; ... procedure TForm1.DBGrid1CellClick(Column: TColumn); begin FilterFieldName:=column.FieldName; end; procedure TADOQuery1.Afterscroll(Sender:TObject); begin if ADOQuery2.active then adoquery1.Locate(FilterFieldName,'我要查找你',[loCaseInsensitive]); end;如果你要实现筛选,那么就是 procedure TADOQuery1.Afterscroll(Sender:TObject); begin if ADOQuery2.active then begin adoquery2.filtered:=false; adoquery2.filter:='关键字段 =+''''+filterfieldname+''''; end;
select * from 从表 where id in(select id from 主表 where key=:parameters)
或者你用LOOKUP字段吧
datasource1.dataset:=adoquery1;
adoquery1.open;
adoquery2.datasource:=datasource1;
adoquery2.sql.clear;
adoquery2.sql.add('select * from tableslave where key=:key'); //这里的key就是关键字段
adoquery2.prepare; //如果用adodataset,这个不能少
adoquery2.open;
还有一个办法就是在datasource1的onchange时间或者adoquery1的afterscroll 事件中使用locate()方法跳转,其实我觉得后者比前者要好,如果你做大型的数据库就会发现,倘若使用了lookup字段,直接用master/slave模式会出现很多问题,我估计是delphi中 ado的一个bug。所以现在我轻易不用前面的方法了,而是用locate和SQL语句配合filter属性来实现。
如果你用按我说的办法运行的时候提示参数不正确,请在adoquery2的params属性中把key的类型设置为string,value设置为unassign或者olestr就可以了。
var
FilterFieldName:string;
...
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
FilterFieldName:=column.FieldName;
end;
procedure TADOQuery1.Afterscroll(Sender:TObject);
begin
if ADOQuery2.active then
adoquery1.Locate(FilterFieldName,'我要查找你',[loCaseInsensitive]);
end;如果你要实现筛选,那么就是
procedure TADOQuery1.Afterscroll(Sender:TObject);
begin
if ADOQuery2.active then
begin
adoquery2.filtered:=false;
adoquery2.filter:='关键字段 =+''''+filterfieldname+'''';
end;
end;
把所有filterfieldname的地方改成adoquery1.fieldbyname(filterfieldname).value;
对不起啊,哈哈