给 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);
vari: Integer;ABookMark, ABK: TBookMark;
beginABK := ClientDataSet1.GetBookmark; //先保存当前位置,搞完循环后方便游标回到当前位置for i := 0 to DBGridEh1.SelectedRows.Count -1 dobeginABookMark := DBGridEh1.SelectedRows.Items[i]; //这是个 BookMarkClientDataSet1.GotoBookmark(ABookMark); //游标走到这个 BookmarkMemo1.Lines.Add(ClientDataSet1.FieldByName('SNO').AsString); //勾选的记录的编号end;ClientDataSet1.GotoBookmark(ABK); //游标回到最开始的位置。
end;
上述代码,是对 DBGridEh 的选择行数做一个循环,然后去它对应的 DataSet 读一个唯一字段(比如主键)的值,就知道用户选择了哪几条记录。这里不需要担心用户勾选后 DataSet 没有 Post 而找不到勾选记录的情况。
结论
使用 DBGridEh 的话,方法之二用户更友好。也无需为 DataSet 增加计算字段,仅仅将 DBGridEh 的两个属性值设置为 True 搞定。