大家知道AdoTable和AdoQuery等组件的Fields是在打开时自动创建的
也可以在组件上选择Add Fields就可以将列添加进去不知道能不能直接从代码行像Add All Fields一样直接将所有列加入Fields
因为我在有需要不能在设计时将列直接使用Add Fields添加到组件中,本来可以不必设置就自动读取了,但我需要用到查询字段(Loopup Fields)直接象下面这样添加查询字段就会显示  字段Clas找不到,因为这时我的AdoTable1还没有Open,但如果我先Open后再添加查询字段的话又提示我不能操作打开的Dataset
如果像注释中这样先将列加入是可以,但列多了必带来不少麻烦,有没有在代码行像设计状态那样执行一个Add Fields就全OK了,我找来找去却没有找到添加的方法,请各位大侠帮忙
{  aField:=TWideStringField.Create(self);
  aField.FieldName:='CLas';
  aField.DataSet:=ADOTable1;
…..
}  aField:=TWideStringField.Create(self);
  aField.FieldKind:=fkLookup;
  aField.FieldName:='SName';
  aField.LookupDataSet:=ADOTable2;
  aField.LookupKeyFields:='Code';
  aField.LookupResultField:='Name';
  aField.KeyFields:='Clas';
  aField.DataSet:=DataSource1.DataSet;
  ADOTable1.Open;
  DBEdit7.DataSource:=DataSource1;
  DBEdit7.DataField:='SName';

解决方案 »

  1.   

    先打开数据集:
    ADataSet.Fields.GetFieldNames(AListBox.Items);
      

  2.   

    欢迎大家来DELPHI群1805366 参加讨论,共同进步!
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      aField : TStringField;
    begin
      ADOQuery1.Open;
      aField := TStringField.Create(nil);
      ADOQuery1.Fields.Add(aField);
      with aField do
      begin
        FieldKind := fkLookup;
        FieldName := 'sName';
        LookupDataSet := ADOQuery2;
        LookupKeyFields := 'Code';
        LookupResultField := 'Name';
        KeyFields := 'Code';
        Lookup := True;
      end;
    end;
      

  4.   

    以上即是打开后再增加一个查询字段,
    创建一个字段后然后再在数据集AdoQuery1增加,即ADOQuery1.Fields.Add(aField);
    本人测试OK
      

  5.   

    TO:枫叶
    为什么我执行了后在Grid中不能显示????
      

  6.   

    DataSource1.Dataset的值为AdoQuery1
    DBGrid1的值为DataSource1
    执行上面的语句后并没有出现那个新增的查询字段
      

  7.   

    如果在DBGrid中也显示出该查询字段,需增加以下代码:procedure TForm1.Button1Click(Sender: TObject);
    var
      aField : TStringField;
      aColumn : TColumn;
    begin
      ADOQuery1.Open;
      aField := TStringField.Create(nil);
      ADOQuery1.Fields.Add(aField);
      with aField do
      begin
        FieldKind := fkLookup;
        FieldName := 'sName';
        LookupDataSet := ADOQuery2;
        LookupKeyFields := 'Code';
        LookupResultField := 'Name';
        KeyFields := 'Code';
        Lookup := True;
      end;  aColumn := DBGrid1.Columns.Add;
      with aColumn do
      begin
        FieldName := 'name';
        Visible := True;
      end;
    end
      

  8.   

    提示错误:
    Field 'sName' has no Dataset
      

  9.   

    Var
      Vfield:Tstringfield;
    begin
      VField := TStringField.Create(Self);
      Vfield.FieldName := 'a';  //这地方写你要加的字段的实际名字就是数据 as 后的名字
      Vfield.Name := ADOQuery1 .Name + Vfield.FieldName;
      Vfield.Index := ADOQuery1 .FieldCount;
      Vfield.DataSet := ADOQuery1 ;
      ADOQuery1 .FieldDefs.UpDate;
      ADOQuery1 .Open
    这是动态删除 
    var
      C: TComponent;
    begin
      C := FindComponent('ADOQuery1a');
      if not (TC = nil) then begin
        ADOQuery1.Close;
        C.Free;
        ADOQuery1.Open;
      end;
      

  10.   

    应改为:
      aColumn := DBGrid1.Columns.Add;
      with aColumn do
      begin
        FieldName := 'sName';
        Visible := True;
      end;但首先应在DBGrid中加入部分数据字段,一定可以
      

  11.   

    dh9450(荡尽尘埃) 讲的时添加普通字段,如果添加查询字段就不行了吧,因为在设置查询字段的时候还要设置查询字段的各属性,所以就提示找不到列了枫叶:
    你说的先在DBGrid中加入部分字段,发如这样的话所有字段就全部要手工加入了,因为加入了几个字段后就不会自动加入其它的字段了