MS Access:在带有数据表子表单的表单中实现 "check all" 框的最简单方法

MS Access: Easiest way to implement a "check all" box in a form with a datasheet subform

我有一个表单,其主要目的是包含一个数据表子表单(该表单提供跨页面的通用视觉主题以及导航按钮,有时还提供子表单的选择标准)。

我的一个子表单有一个复选框。

用户行为将是:

  1. 打开此表格
  2. 根据一些规范过滤数据表
  3. 做一些离线的事情,例如,十个可见的订单项
  4. 检查这十个订单项的字段(yes/no 字段)以表明它已完成

我希望用户能够选中一个框,然后选中所有可见的框。

挑战在于它只能是可见的,即取决于所使用的过滤器。

我试图在标有“全部选中”的主窗体中创建一个复选框,运行的代码类似于:

me.sfrmReport.Control.reported.value = me.chkCheckAll.value

但不幸的是,这只检查了活动行,而不是全部。我知道我可以 运行 查询基础 table,但它需要复制用户过滤器。

事实上,可能更酷的是“检查突出显示”框,它只检查突出显示的行。

不过我觉得“全选”会更好

我试图找到这个,但我的搜索技巧让我失望了。我原以为这有点普遍,但也许我想错了。我确实注意到有一个求和函数可以自动对数据表中的 filtered/visible 行求和,因此仅​​与可见行交互的概念至少在某种程度上是标准的。

好吧,选中所有复选框当然不应该在“行”上。因此,人们会假设在组合框旁边说,您放置了一个全选框。 (无法想象按钮或代码会放在行上)。

所以,在屏幕截图中的组合框旁边,有一个名为“全部选中”的按钮。

该按钮背后的代码 would/could 是:

dim rst     as dao.RecordSet
set rst = me.MySubForm.Form.RecordSetClone
rst.movefirst
do while rst.EOF = false
   rst.edit
   rst!ResultReported = true
   rst.update
   rst.moveNext
loop
me.MySubForm.Form.Refresh

所以上面将直接对子表单数据源(当前过滤记录集)进行操作。

我从你的截图中“认为”,表单的顶部(带组合)是主表单,你显示的子表单是子表单。

所以,当然你必须替换我上面使用的控件的名称,以及复选框的字段名称。

所以获取该记录集的格式是:

me.MySubFormControlName.Form.RecordSetClone

当然是在代码 运行s 之后触发子表单的刷新。

me.MySubFormControlName.Form.Refresh

请注意,intel-sense 应该可以帮助您。如果代码没有编译,那么在编译之前不要尝试 运行 它。