DBGridEh中为某列增加EditButton后该列无法再编辑,要怎么改?

Ascn 2008-01-03 01:37:39
我在一个模式窗口中,有一个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; //打开一个模式窗口让用户选择, 选择后会自动为相应列赋值
...全文
343 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ascn 2008-01-17
  • 打赏
  • 举报
回复
再回来看一眼,竟然没有新贴,CSDN的Delphi论坛有点让人失望

50分全部送给关注此贴的朋友,谢谢!

郁闷中结贴
Ascn 2008-01-03
  • 打赏
  • 举报
回复
怎么好象用EhLib的人很少吗?没人遇到过这种要求?

郁闷ing...
Ascn 2008-01-03
  • 打赏
  • 举报
回复
不是。加不加PickList与KeyList都一样,只要有了EditButtons.Add后,就不能直接输入了。
stherix 2008-01-03
  • 打赏
  • 举报
回复
可能是有PickList KeyList的问题
加了按钮是可以修改的
Ascn 2008-01-03
  • 打赏
  • 举报
回复
控件DBEditEh都可以在使用按钮的同时,也可以直接输入。但DBGridEh中就不行了,在DBGridEh中如果仅仅是为某列增加了PickList和KeyList的话,也不能输入了,必须选择。

或者,是否可以修改DBGridEh源码解决?
Ascn 2008-01-03
  • 打赏
  • 举报
回复
怪我没有说清楚,Columns[3]仅为明细数据中的商品列,并非主键。明细数据中另有专门的编号列作为主键。
当然如果我不加EditButton的话,就是可以修改的。但一旦使用了EditButton后就不能直接输入了,必须用按钮选择。
只是我现在想两种方式都能使用:按钮选择和直接输入。应该怎么办?
stherix 2008-01-03
  • 打赏
  • 举报
回复
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;//加在这,应该有效果的
//主键列默认是不可修改的
Ascn 2008-01-03
  • 打赏
  • 举报
回复
还是不行哦。同时我的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;
stherix 2008-01-03
  • 打赏
  • 举报
回复
DBGridEh1.Columns[0].ReadOnly:=False;
加句就好了

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧