在DGgrid中使用下拉组合框

  在数据库程序中,特别是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.

第二种方法才是面向对象编程正确的做法,我们需要去了解对象的属性,然后利用它们达到我们的需求。

    

  

 

posted on 2023-07-07 22:56  Delphi搬运工  阅读(316)  评论(0)    收藏  举报