给 DBGridEh 增加勾选用的检查框 CheckBox

需求

Delphi 的 DBGrid 通过 DataSource 绑定到一个 DataSet 显示数据表里面的 N 多条记录。如果我想给每条记录加一个 CheckBox 让用户去勾选,该怎么做?

以下描述,使用的 DBGrid 是 DBGrieEh

Delphi 自带的 DBGrid 要加 CheckBox 比较麻烦一点,这里不提。

解决方案之一:

在 DataSet 里面增加一个内部计算字段,字段的数据类型是 Boolean,用于勾选。

1. 在设计期为 DataSet 创建对应数据库的固定字段;

2. 设计期,为 DataSet 新增一个字段,我在这里给字段取名字 Checked,字段类型选择 fkInternalCalc,字段的数据类型选择 Boolean;

3. 设计期,为 DBGrid 添加固定字段。

4. 执行程序,加载数据,就会看到设计期为 DataSet 添加的 Checked 字段,呈现为检查框的模样。使用鼠标点击可以勾选。

5. 我们的代码如何获取用户勾选了哪些记录?对 DataSet 逐条记录循环,查看 Checked 字段的值是否为 True。

此方案的问题:

用户勾选后,DataSet 处于编辑状态,勾选(对 Checked 字段的值的更改)还没有 Post,此时读 DataSet 对应的字段的值,可能还是 False。当然,用户勾选后,用鼠标顺带点一下别的记录,使得 DataSet 自动执行 Post,就没这个问题了。但这样做多一个操作,并且使用者可能忘记这个操作,导致程序执行结果和预期不符。 

解决方案之二

不需要给 DataSet 增加一个计算字段,仅仅是设置 DBGridEh 的属性就可以解决。并且没有方案一的那个让操作者迷惑的问题。

1. DBGridEh 的属性 Options 里面的 dgMultiSelect 设置为 True;设计期的话,就是属性面板里面找到这个属性,勾选它。

2. DBGridEh 的属性 IndicatorOptions 里面的 gioShowRowselCheckboxesEh 设置为 True。设计期的话,同样是属性面板里面找到这个属性,勾选上。

搞定这两步,运行起来,加载数据库的数据,DBGridEh 的第一列就是 CheckBox 检查框。不需要它对应的表有 Boolean 类型的字段。

这个检查框,用户可以点击勾选。那么,我们怎么用代码来检查用户勾选了啥?

假设这个 DBGridEh 对应的表,有一个主键字段是  SNO,那么,读到用户勾选的记录的 SNO 就知道用户勾选了那几条记录。

代码如下

procedure TForm3.Button5Click(Sender: TObject);
var
  i: Integer;
  ABookMark, ABK: TBookMark;
begin
  ABK := ClientDataSet1.GetBookmark;  //先保存当前位置,搞完循环后方便游标回到当前位置

  for i := 0 to DBGridEh1.SelectedRows.Count -1 do
  begin
    ABookMark := DBGridEh1.SelectedRows.Items[i]; //这是个 BookMark
    ClientDataSet1.GotoBookmark(ABookMark);  //游标走到这个 Bookmark
    Memo1.Lines.Add(ClientDataSet1.FieldByName('SNO').AsString); //勾选的记录的编号
  end;

  ClientDataSet1.GotoBookmark(ABK);  //游标回到最开始的位置。
end;

上述代码,是对 DBGridEh 的选择行数做一个循环,然后去它对应的 DataSet 读一个唯一字段(比如主键)的值,就知道用户选择了哪几条记录。这里不需要担心用户勾选后 DataSet 没有 Post 而找不到勾选记录的情况。

结论

使用 DBGridEh 的话,方法之二用户更友好。也无需为 DataSet 增加计算字段,仅仅将 DBGridEh 的两个属性值设置为 True 搞定。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值