DBGridEh 的字段 TDBGridColumnEh 的 DropDownFormParams 属性的用法

这篇博客详细介绍了如何利用Ehlib库中的TDBGridColumnEh控件和TDropDownFormEh类,在Delphi应用程序中创建一个具有过滤功能的下拉框。通过设置DropDownFormParams属性,自定义下拉窗体并在其中添加DBGridEh以展示和过滤数据。用户在下拉框中输入字符时,DBGridEh会自动过滤记录。同时,通过OnReturnParams和OnIniForm事件处理程序,实现了选中记录后在原DBGridEh字段中填充所选值的功能。

前提:

有两个 DataSet1 和 DataSet2;

DataSet1 有两个字段:UID 和 UNAME;

DataSet2 有多个字段,其中一个字段是 UID,对应 DataSet1 的 UID 字段。为 DataSet2 创建一个 Lookup 字段为 UName,这样一来,把一个 DBGridEh 绑定 DataSet2 并创建固定字段的时候,其对应的 UName 这个字段是可以下拉的,下拉的内容就是 DataSet1 里面的 UNAME 字段的所有记录,挑选一个记录,则 DataSet2 的 UID 字段就自动填入对应的值。

 

问题:

当 DataSet1 里面的记录非常多的时候,这个下拉框里面太多记录,用户就不容易挑选自己想要的记录了。如果这个下拉框里面附带过滤就好了。

 

解决方法:

DropDownBox

DBGridEh 的字段类型是 TDBGridColumnEh,它有很多属性。其中一个属性是 DropDownBox,这个属性底下有一堆属性。使用这个属性,不会出来想要的过滤效果。或者是我不会使用。

 

DropDownFormParams 

DBGridEh 的字段类型是 TDBGridColumnEh,它有很多属性。其中一个属性是 DropDownFormParams 。DBGridEh 自己带的 Demo 里面,有一个 FrameDropdownForms 的例子。我模仿这个例子,学习了一下如何使用。

使用这个 DropdownForm 有个好处,就是在点击这个字段的下拉按钮时,弹出来的是一个 Form,在这个 Form 上,你可以放各种控件,使得这个 Form 作为一个下拉面板,内容可以非常丰富。

当然,我们这里的目的就是选择 DataSet1 里面的记录,这里只要有个 DBGrid 显示记录,然后可以对这个 DBGrid 里面显示的记录进行过滤就可以了。要显示记录并能够过滤记录,最简单的还是用一个 DBGridEh。

 

操作步骤:

1. 首先要有一个独立的 Form,这个 Form 作为一个面板,在 DBGridEh 的某个字段被点下去的时候,在该字段对应的位置弹出来。这个 Form 必须是继承自 TCustomDropDownFormEh;

1.1. 设计期要想创建这么一个 Form,选择 IDE 菜单的 File / New / Other 菜单,弹出 IDE 的对话框。在对话框的左边栏里面选择:Ehlib Forms -- 前提是你的 Delphi IDE 安装了 Ehlib 这套控件;然后选择右边的 DropDown Form ,点对话框底部的 OK 按钮,Delphi IDE 自动创建了一个 TDropDownForm2 = class(TCustomDropDownFormEh)  这里根据需要修改名字,保存它。

2. 在这个 TDropDownForm2 上面,拖放一个 Panel 设置 Align 为 Bottom,拖放一个 DBGridEh 设置 Align 为 Client;

3. 在 Panel 上面放 2 个按钮,一个是【确定】;一个是【取消】,代码分别如下:

procedure TDropDownForm2.Button1Click(Sender: TObject);
begin
  ModalResult := mrOK;
  Close;
end;

procedure TDropDownForm2.Button2Click(Sender: TObject);
begin
  ModalResult := mrCancel;
  Close;
end;

4. 设置 DBGridEh 对应的 DataSource 以及这个 DataSource 对应的 DataSet,这里也就是本文最前面说的 DataSet1,用来做 Lookup 的源头。

4.1. 设置这个 DBGridEh 的 SearchPanel 属性底下的 Enabled 属性为 True,它的顶部出现一个横条输入框,在里面输入字符的时候,它会自动过滤记录。

5. 为这个 DropdownForm 添加一个注册,代码如下:

initialization
  RegisterClass(TDropDownForm2);

6. 从程序项目工程里面,去掉自动创建这个 Form 的代码://Application.CreateForm(TDropDownForm2, DropDownForm2);  这里我是注释掉,没有删除。

7. 回到之前的界面上的那个 DBGridEh 双击弹出它的字段,里面那个用于 Lookup 下拉的 UName 字段,选中它,在属性面板里面,打开 DropDownFormParams 属性,底下有一堆属性需要设置。

7.1. AssignBackFiledNames 属性,填写:UID;UName (注意:这里必须是两个字段。我尝试只有  UName 字段,结果在下拉的 Form 里面选择了一条记录,选择的结果,并不会返回到这里来)。

7.2. DropDownFormClassName 属性,填写:TDropDownForm2  也就是那个新创建的 DropDownForm 的类名称;

7.3. DropDownForm 属性,不用填写。

7.4. PassFieldNames 属性:这里的属性是在弹框时,将当前 DBGridEh 的哪些字段的值,送给 DropDownForm 里面的 ReturnParams 事件方法;如果这里不填字段名称,则是将当前弹框的字段名和值作为参数送过去。

7.5. PassParams 属性,选择 pspFieldValueEh;  选择其它该如何使用,我也没测试。

7.6. 为刚才创建的 TDropDownForm2 声明一个方法:class function GetGlobalRef: TCustomDropDownFormEh; override; 实现代码如下:

class function TDropDownForm2.GetGlobalRef: TCustomDropDownFormEh;
begin
  if DropDownForm2 = nil then
    Application.CreateForm(TDropDownForm2, DropDownForm2);
  Result := DropDownForm2;
end;

7.7. 到这里,运行程序,在界面上的 DBGridEh 对应的字段上面点击一下,就会在正确的位置弹出这个 DropDownForm。但是,在这个 Form 里面选择一条记录,点击【确定】按钮后,并不会在当前的 DBGridEh 的对应字段里面填入选择的值。这里还需要:

7.8. 在 IDE 里面选择 TDropDownForm2,到属性面板的事件页,找到 OnReturnParams 事件,双击它,在 IDE 产生的事件方法框架里面写上代码:

procedure TDropDownForm2.CustomDropDownFormEhReturnParams(
  Sender: TCustomDropDownFormEh; DynParams: TDynVarsEh);
var
  S: string;
begin
  if DynParams = nil then Exit;

  S := DynParams.Items[0].Name;

  DynParams['UName'].AsString := Form1.FDMemTable1.FieldByName('UName').AsString;
  DynParams['UID'].AsString := Form1.FDMemTable1.FieldByName('UID').AsString;

end;

有了上述代码,当点击【确认】按钮,这个 TDropDownForm2 关闭后,回到之前的 DBGridEh 里面,对应的字段被自动填入了刚才选择的记录值。

7.9. 在当前的 DBGridEh 里面已经有很多记录时,选择一条记录,点击 UName 字段,弹出的 TDropDownForm2 里面的 DBGridEh 的记录,要对应到刚才选中的记录的 UName 的值的记录,还需要在 TDropDownForm2 的事件面板里面找到 OnIniForm 事件,双击产生代码框架,填入以下代码:

procedure TDropDownForm2.CustomDropDownFormEhInitForm(
  Sender: TCustomDropDownFormEh; DynParams: TDynVarsEh);
var
  ID: string;
begin
  DBGridEh1.SearchPanel.CancelSearchFilter;
  DBGridEh1.SearchPanel.SearchingText := '';

  if DynParams = nil then Exit;
  ID := DynParams['UName'].AsString;
  if ID <> '' then
    Form1.FDMemTable1.Locate('UName', ID, []);
end;

8. 做完以上步骤,想要的功能就已经实现了。

 

总结:

1. 这里是使用继承自 TCustomDropDownFormEh 的一个 Form 用于给 DBGridEh 的某个字段下拉;

2. 不需要事先创建这个 Form 的实例,由字段里面的 DropDownFormClassName 填写的类名,让 DBGirdEh 在下拉时自动去创建。当然前提是要注册这个 TDropDownForm2 

3. 字段:要填入两个字段,而不能只填入一个字段;

4. 两个事件方法里面的代码,来达到 TDropDownForm2 和原本的 DBGridEh 之间互相传递数据的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值