在数据库程序中,特别是ERP中,在DBgrid中使用下拉组合框的情况十分常见,比如,一个产品有几个规格,当我输入了某个产品后,希望规格给出选项,因为规格一般是固定哪几种,手动输入的话容易出错,网上搜了一下,有一种是在DBGrid中插入下拉组合框,另外一种是利用DBGrid的TColumn的PickList来实现
1.在DBGrid中插入下拉组合框:其实就是一个下拉组合框,改变它的位置,显示/隐藏,来达到目的
主要代码如下:
procedure TForm1.DBGrid1DrawDataCell(Sender:TObject;const Rect:TRect;Field:TField;State:TGridDrawState);
begin
if (gdFocused in State) then
if (Field.FieldName=DBComboBox1.DataField) then //如果点击的字段是你想要的字段
begin
//调整DBComboBox1的位置,长度,宽度等,自己可以按需要调整
DBComboBox1.left:=Rect.left+DBGrid1.left;
DBComboBox1.Top:=Rect.Top+DBGrid1.top;
DBComboBox1.width:=Rect.Right-Rect.left;
DBComboBox1.Height:=Rect.Bottom-Rect.Top;
DBComboBox1.Visible:=True; //设计阶段,DBComboBox1.Visible为False
end;
procedure TForm1.DBGrid1ColExit(Sender:TObject);
begin
if DBGrid1.SelectedFiedl.FieldName=DBComboBox1.DataField then
begin
DBComboBox1.Visible:=False; //当选的其他列时,隐藏起来
end;
end;
procedure TForm1.DBGrid1KeyPress(Sender:TObject;var Key:Char);
begin
if (key<>chr(9)) then
if (DBGrid1.SelectedField.FieldName=DBComboBox1.DataField) then
begin
DBComboBoxq.SetFocus;
SendMessage(DBComboBox1.Handle,WM_CHAR,word(key),0);
end;
end;
注意:DBComboBox1获取值,可以从数据库某表获取后,遍历赋值给它,当然普遍的TComboBox下拉组合框也行
2.利用TColumn的PickList属性来实现:PickList其实是TStrings类型,一般是在需要的时候动态赋值一个TStrings类型的值给它
比如我们在点击DBGrid1中某个字段时
procedure TForm1.DBGrid1DrawColumnCell(Sender:TObject;const Rect:....);
var
Astrings:TStringList;
begin
Astrings:=TStringList.create;
try
//此处给Astrings添加需要的数据,比如根据你所选行的产品,去数据库找到该产品有多少种规格,然后全部添加进Astrings中
Astrings.Add('a'); //此处只是测试
Astrings.Add('b');
Column.PickList:=Astrings;
finally
Astrings.Free; //记得释放该变量,不然会内存泄漏
end;
end;
当然上面的做法会令所有的Column都会生效,这时我们就应该使用if条件去判断一下,
比如 if Column.FieldName='Size' then
此Column是否是我们需要的列,然后再去赋值给PickList.
第二种方法才是面向对象编程正确的做法,我们需要去了解对象的属性,然后利用它们达到我们的需求。
标签:begin,end,组合,DBComboBox1,DBGrid1,使用,DGgrid,Astrings,Rect From: https://www.cnblogs.com/AP0606436/p/17536343.html