论坛上的各位朋友,大家好,想向各位朋友请教一个动态在DBGRIDEH里面添加内容的问题有表1和表2表1内容
姓名    年龄
张三     18
张三哥   20
张三大哥 40
李四     19
李四哥   30表2内容姓名
张三
张三哥
张三大哥
李四
李四哥
然后在程序里面添加一个DBGRIDEH和一个ADOQUERY还有一个DATASET,DBGRIDEH里面显示的是表1的内容,也就是说,只有姓名和年龄两列数据当用户在DBGRIDEH的列1,也就是姓名该列,输入一个“张”的时候,希望马上可以跳出一个下拉菜单,下拉菜单的内容为“表2”里面以“张”字开头的所有记录,其它的不要,然后可以供用户方便选择,如果用户输入的是一个“李”字,下拉菜单的内容为“表2”里面以“李”字开头的所有记录。
论坛上的各位朋友,请问这个需求可以实现吗?如果能实现,请各位朋友告知方法,衷心感谢!!!

解决方案 »

  1.   

    通知各位IT的技术朋友,有好东西与大家共同分享
    2008年07月15日 周二 高新技术企业IT、电子 在海淀分部举行
    招聘会 http://www.palmjob.net/zhpd/
    北京招聘会 http://www.palmjob.net/zhpd/bjindex.jsp
      

  2.   

    可以做到,在姓名列内嵌一個下拉框,再要一個ADOQUERY
    輸入“张”,就在表2用一個sql模糊查找出“张”開頭的記錄
      

  3.   

    楼上的朋友,但问题是,如果才能将下拉框嵌入到DBGRIDEH里面,而且怎样才能控制它的位置呢?请再次赐教,谢谢!
      

  4.   

    procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);
    begin
      //响应第一列
      if DBGridEh1.SelectIndex=0 then
        begin
         //动态创建一个edit;或者在窗体上放个visible为false的edit,点击本列的时候自动弹出,并设为焦点,输入值回车后自动刷新adoquery进行模糊匹配筛选
        end;
    end;
      

  5.   

    楼上的朋友,思路确实是这样,但问题是实现起来不容易,另外,小弟是想用COMBOBOX来实现,主要利用DBBRIDEH嵌入COMBOBOX的技术,自己找网找过资料,但可惜环境搭不起来,希望有朋友能帮忙解决该问题,衷心谢谢!
      

  6.   

    在表格的重画中加入一个picklist ,具体在哪个事件里我也忘了,呵好久没搞数据库了..
    这个 picklist 内容就是你模糊查找到的内容
      

  7.   

    放一个ComboBox在上边
    然后参考如下代码:procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
    begin
     if Key = #13 then 
      if ActiveControl = DBGrid1 then begin
        TDBGrid(ActiveControl).SelectedIndex := TDBGrid(ActiveControl).SelectedIndex + 1;
        Key := #0;
      end;
    end;procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
      If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then
        begin
          DBComboBox1.Visible := false;
        end;
    end;
      

  8.   

    唉,谢谢楼上的各位朋友,再UP一下,希望有朋友能帮忙提供一个实际的小例子,再顶一下,期待ING....
      

  9.   

    我刚好使用了这个功能,和大家分享一下我添加了一个 dblooklistbox (你也可以用dbcombox不过那样动态改变有点麻烦)
    然后 datasource 设置和dbgrideh 同样的,在 listsource .连接到一个 你将要做模糊查找的查询
    查询要设置好 parameters 属性里面添加 条件 pm ,
    查询语句:SELECT 商品批次.商品批次编号, 商品目录.商品品名 as 商品名称, 商品批次.商品规格, 商品批次.商品条码, 商品批次.商品助记码, 商品批次.批号, 商品批次.厂家, 商品批次.有效期
    FROM 商品批次 INNER JOIN 商品目录 ON 商品批次.商品 = 商品目录.商品编号
    where  商品目录.商品品名  like :pm ;设置好 listfield 就是列表框出现的字段 ,和 keyfield 和你要录入的数据连接的字段名。
    把dblooklistbox1 默认隐藏。//在商品字段录入框下面显示这个dblooklistbox 列表框,并确定位置
    procedure Tspgl_sprkfrm.DBGridEh1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumnEh;
      State: TGridDrawState);
    begin
    if gdFocused in State then
    begin
    if column.FieldName='商品' then
    begin
    spcx_list.Top:=DBGridEh1.Top+rect.Bottom;
    spcx_list.Left:=rect.Left+DBGridEh1.Left;
    spcx_list.Height:=DBGridEh1.Height-rect.Top;
    spcx_list.Visible:=true;
    end
    else
    spcx_list.Visible:=false;
    end;
    end;//当不在这个字段的时候 隐藏procedure Tspgl_sprkfrm.DBGridEh1ColExit(Sender: TObject);
    begin
    if DBGridEh1.SelectedField.FieldName='商品' then
    data.spgl_xzsp_ds.DataSet:=data.spgl_sppc_Tab
    else
    end;,
    //模糊查询功能,根据在商品里面输入的内容 ,通过模糊查询语句自动筛选,达到列表框的内容根据输入的内容随时变化
    //这里取出输入文字我查了很久才找到办法的,就是这个 TInplaceEdit(DBGridEh1.Controls[0]).Text
    procedure Tspgl_sprkfrm.DBGridEh1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
      var sp:string;
      begin
       if DBGridEh1.SelectedField.FieldName='商品' then
      begin
    if DBGridEh1.ControlCount>0  then  sp:= TInplaceEdit(DBGridEh1.Controls[0]).Text; //取出输入的文字
    data.spgl_xzsp.close;
    data.spgl_xzsp.Parameters.ParamByName('pm').Value:='%'+sp+'%';//'%水%';
    data.spgl_xzsp.Open;
    data.spgl_xzsp_ds.DataSet:=data.spgl_xzsp;
    end;
    end;我这里用"商品" 字段保存商品的名称,还有个问题没解决,就是在列表框里选择后的代码。
    以上不对的地放请大家指正,不过楼主的问题已经在这里解决了。