当前位置: 首页 > news >正文

给 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 搞定。

相关文章:

  • Qt笔记---》.pro中配置
  • Java项目拷打(外卖+点评)
  • Java大师成长计划之第22天:Spring Cloud微服务架构
  • 软考 系统架构设计师系列知识点之杂项集萃(59)
  • 计算机组成原理:I/O
  • 论MCU如何在Fatfs中使用Flash接口的方法
  • TCP/IP参考模型详解:从理论架构到实战应用
  • 【Java】 volatile 和 synchronized 的比较及使用场景
  • matlab插值方法(简短)
  • 可编辑38页PPT | 数字化建设—财务系统规划方案
  • Git仓库迁移
  • 电流检测放大器的优质选择XBLW-INA180/INA181
  • MQTT详细介绍
  • SQL注入 ---04
  • 移动端巡检点检,让设备管理更便捷高效
  • centos服务器,疑似感染phishing家族钓鱼软件的检查
  • ElasticSearch高级功能
  • OpenUCX 库介绍与使用指南
  • 【信息系统项目管理师】第5章:信息系统工程 - 36个经典题目及详解
  • 生成对抗网络(Generative Adversarial Networks ,GAN)
  • 俄方代表团抵达土耳其,俄乌直接谈判有望于当地时间上午重启
  • 美国与卡塔尔签署超2435亿美元经济及军事合作协议
  • 蚊媒传染病、手足口病……上海疾控发布近期防病提示
  • 刘永明|在从普及到提高中发展新大众文艺
  • 广东韶关一镇干部冲进交通事故火海救人,获授“见义勇为”奖励万元
  • 中国目的地·入境游简报006|外国网红游中国启示录