我用DBGrid为什么动态连上数据库后没有数据,必须用鼠标点一次出现一个数据,还有我在DBGrid立面动态建立了下拉列表框,为什么总是出现一行数据

解决方案 »

  1.   

    用refresh语句对数据表刷新一次试试,
      

  2.   

    你在设计的时候,让相连的table和其他数据集的active等于true,看看DBGrid有没有全部显示数据。
      

  3.   

    我现在是把动态设置下拉列表框写在了ONColEnter事件里面了,但是老是出现有重复的数据,我只要点击别的下拉列表框,就会多出现一行,为什么?我现在想用判断来去掉,但怎么得到我选择得列名?
      

  4.   

    Procedure  setpicklist(ADOQueryName:TADOQuery;DBGridCode:TDBGrid;str:string;fieldname:string;i:integer);
    begin
       ADOQueryName.SQL.Clear ;
       ADOQueryName.SQL.Add(str);
       ADOQueryName.Open;
       ADOQueryname.First;
       DBGridCode.Columns[i].PickList.append(ADOqueryname.fieldbyname(fieldname).AsString);
       ADOqueryname.Next;
    end;
    ///////////////////////
    procedure TFormCode.DBGridCodeColEnter(Sender: TObject);
    var
      str:string;
    begin
      if TreeViewCode.Selected.Text = '产品编码' then
      begin
        if DBGridCode.c = 'prodname' then
           begin
             str:='select * from P_ProdName';
             SetPicklist(ADOQueryName,DBGridCode,Str,'prodname',1);
           end;
        Str:='select * from P_ProdSpec';
        SetPicklist(ADOQueryName,DBGridCode,Str,'spec',2);
        Str:='select * from P_ProdColor';
        SetPicklist(ADOQueryName,DBGridCode,Str,'prodcolor',3);
        Str:='select * from P_ProdType';
        SetPicklist(ADOQueryName,DBGridCode,Str,'prodtype',4);
      end;
    end;
      

  5.   

    我现在是把动态设置下拉列表框写在了ONColEnter事件里面了,但是老是出现有重复的数据,我只要点击别的下拉列表框,就会多出现一行,为什么?我现在想用判断来去掉,但怎么得到我选择得列名?
      

  6.   

    1.
    //在DBGrid的colEnter事件写下如下代码,即可实现下拉列表
    with DBGri1.selectedfield do
    if (FieldName='field1') then //field1下拉显示FieldMc值
         with adoquery1 do
         begin
           close;
           sql.Clear ;
           sql.Add('select distinct fieldmc from  table1 ');//信息来源表
           open;
           if recordcount>0 then
           begin
            first;
            with DBgrid1  do
            for j:=1 to FieldCount do
             if columns[j].FieldName ='fieldmc' then
             begin
              columns[j].PickList.Clear;
              for i:=1 to recordcount do
               begin
               columns[j].PickList.Add(fieldbyname('fieldmc').value);
               next;
               end;
               break;
             end;
           end;
           close;
         end;
      
     
     
     
      添加Lookup字段也可以实现同样的效果,
    不过Lookup是针对query(Adoquery)实现的
    鼠标双击query(adoquery),鼠标单击右键,
    New Field设置Field type=Lookup
    然后设置相关属性即可!
    直接用ADOquery与DBgrid关联,在query中新建一字段(假设名为X),设为lookup,并与你的表相联,OK了,在DBGrid中的X字段中就自动是下拉列表了!!
    2.用PICKLIST:
    dbgrid1.Columns[第几个字段].PickList.append(ADOTABLE.FIELDBYNAME('字段名').ASSTRIING)
    用PICKLIST:
    dbgrid1.Columns[第几个字段].PickList.append(ADOTABLE.FIELDBYNAME('字段名').ASSTRIING)
    用PICKLIST:
    dbgrid1.Columns[第几个字段].PickList.append(ADOTABLE.FIELDBYNAME('字段名').ASSTRIING)
    设置DBGrid1.Columns[I].PickList属性,就可以把DBGrid1的第I列变成一个下拉框,如果要求第I列的不同行的下拉框内容不同,那就把跟DBGrid1关联的数据集设置一个单键索引,在OnCellClick事件中读取当前记录数据,来确定显示什么下拉框