我在一个模式窗口中,有一个DBGridEh名为dbg, DataSet为代码中动态Active的,并在代码中动态将各列属性指定. 其中第3列(商品ID字段)要设置成可点击按钮后新开窗口选择的功能(选择后将所选ID赋给本字段),因为提供选择的数据很多,使用下拉列表的话不太好找到需要选择的内容. 
现在用户提出要求需要可以直接输入并在保存时将输入的内容一并存盘. 但我现在发现设置按钮后,该列已经无法输入,不知道怎么让它在保留按钮功能的同时又可以输入?相关代码为:  dbg.Columns[3].Title.Caption := '品  名';
  dbg.Columns[3].Width := 200;
  dbg.Columns[3].Alignment := taLeftJustify; //数据库中该字段为商品ID号, 默认情况下数字会右对齐显示
  btn := dbg.Columns[3].EditButtons.Add;
  btn.Style := ebsEllipsisEh;
  btn.OnClick := WareEditButtonClick; //打开一个模式窗口让用户选择, 选择后会自动为相应列赋值

解决方案 »

  1.   

    DBGridEh1.Columns[0].ReadOnly:=False;
    加句就好了
      

  2.   

    还是不行哦。同时我的dbg没有设置任何ReadOnly为True。忘了加上一部分,在WareEditButtonClick函数中使用了一个函数,该函数为Columns[3]增加了PickList和KeyList。但是,虽然如此,在未按下按钮之前,即没有执行这个函数之前,就已经无法编辑了。希望高手们不吝赐教procedure TfrmKp.FillDBGridWare(id: integer; bLoad: Boolean);
    var
      qu: TADOQuery;
      s: string;
    begin
      s := 'Select * from Ware where ID = ' + IntToStr(id);
      qu := TADOQuery.Create(Self);
      qu.Connection := DM.conn;
      qu.SQL.Text := s;
      qu.Active := True;
      qu.First;
      if not qu.Eof then
      begin
        s := qu.FieldByName('WareName').AsString;
        if dbg.Columns[3].PickList.IndexOf(s) < 0 then // -1
        begin //判断的目的是为了在DBGridEh第二行选择同样商品时不重复加入PickList中
          dbg.Columns[3].PickList.Add(s);
          dbg.Columns[3].KeyList.Add(IntToStr(id));
        end;
        //赋值后必须跳转焦点,否则不生效,造成只计算一行的金额
        dbg.SelectedIndex := dbg.SelectedIndex + 2; //跳过两列
        if bLoad then
        begin
          ds_invd.Edit;
          ds_invd.FieldByName('Unit').AsString := qu.FieldByName('Unit').AsString;
          ds_invd.FieldByName('Price').AsCurrency := qu.FieldByName('Price').AsCurrency;
        end;
      end;  qu.Close;
      qu.Free;
    end;
      

  3.   

    dbg.Columns[3].Title.Caption   :=   '品  名'; 
        dbg.Columns[3].Width   :=   200; 
        dbg.Columns[3].Alignment   :=   taLeftJustify;   //数据库中该字段为商品ID号,   默认情况下数字会右对齐显示 
        btn   :=   dbg.Columns[3].EditButtons.Add; 
        btn.Style   :=   ebsEllipsisEh; 
        btn.OnClick   :=   WareEditButtonClick;
       dbg.Columns[3].ReadOnly:=False;//加在这,应该有效果的
    //主键列默认是不可修改的
      

  4.   

    怪我没有说清楚,Columns[3]仅为明细数据中的商品列,并非主键。明细数据中另有专门的编号列作为主键。
    当然如果我不加EditButton的话,就是可以修改的。但一旦使用了EditButton后就不能直接输入了,必须用按钮选择。
    只是我现在想两种方式都能使用:按钮选择和直接输入。应该怎么办?
      

  5.   

    控件DBEditEh都可以在使用按钮的同时,也可以直接输入。但DBGridEh中就不行了,在DBGridEh中如果仅仅是为某列增加了PickList和KeyList的话,也不能输入了,必须选择。或者,是否可以修改DBGridEh源码解决?
      

  6.   

    可能是有PickList KeyList的问题
    加了按钮是可以修改的
      

  7.   

    不是。加不加PickList与KeyList都一样,只要有了EditButtons.Add后,就不能直接输入了。
      

  8.   

    怎么好象用EhLib的人很少吗?没人遇到过这种要求?郁闷ing...
      

  9.   

    再回来看一眼,竟然没有新贴,CSDN的Delphi论坛有点让人失望50分全部送给关注此贴的朋友,谢谢!郁闷中结贴