使用 VBA 代码有条件地使表单行的(详细信息)按钮变灰

Posted

技术标签:

【中文标题】使用 VBA 代码有条件地使表单行的(详细信息)按钮变灰【英文标题】:Gray out a form row's (detail's) button conditionally with VBA code 【发布时间】:2011-09-02 14:22:53 【问题描述】:

我在 MS-Access 中有一个标准表单,其中列出了一堆订单,每行包含订单号、客户等字段 + 一个用于查看注释和附加文档文件的按钮。

根据客户的要求,我们应该将按钮 btnAnm 灰显(或选中或取消选中复选框),具体取决于从两个查询到另外两个表的计算(一个 SELECT COUNT WHERE 并检查一个文本字段是否为空)。

我试过btnAnm_BeforeUpdate(...)btnAnm_BeforeRender(...) 并在subs 中放置断点,但它们都没有触发。如果我使用控件Ordernr 而不是btnAnm,则相同。

可以说,我希望为每个“Me.”(行)触发 Detail VBA 代码中的一个函数,并在该子项中设置行的控件属性。

我该怎么办?我查看了帮助文件并在此处搜索。

*编辑:所以我想做一些“不能那样工作”的事情? IE。事件不会在详细信息中触发。 作为替代方案,我是否可以根据当前行的“Ordernr”字段以及来自另一个表的 SELECT COUNT 和空字段检查的结果的查询,将每行上的复选框的值作为基础?

我是在列表所基于的查询中执行此操作,还是可以将额外的复选框字段绑定到查询?

我认为,对如何执行此操作的描述(将 COUNT 和 WHERE“非空”组合为是/否复选框值)是完全可以接受的! :)*

【问题讨论】:

你能显示一些代码吗?尤其是你想触发代码的地方 在哪里放置代码以便触发每个详细信息行是我(是?)问的,代码现在是 btnAnm.ForeColor=0... ;) 【参考方案1】:

您不能对连续形式的未绑定控件做很多事情,您所做的任何事情都只会应用于当前记录。您可以使用带有单击事件的绑定控件,使其像按钮一样发挥作用。

想必相关的文档有一个对出现在你表单上的订单号的引用,这意味着你可以创建一个控件,让我们称之为CountOrders,像这样使用一个ControlSource:

=DCount("OrderID","QueryName","OrderID=" & [OrderID])

该控件可以隐藏,或者您可以将其设置为返回 true 或 False 以与文本框一起使用,您也可以将其用于条件格式,但遗憾的是,不适用于命令按钮。

Expression Is [CountOrders]>0

您还可以隐藏内容并添加单击事件,以便代替命令按钮。条件格式将允许您启用或禁用文本框。

【讨论】:

我很高兴能以某种方式“标记”该行作为两个查询的结果,更改某些元素的颜色或设置该行上的复选框值。标记它是为了让用户知道订单中是否有需要阅读的注释/文档。 @Henrik 我添加了一些注释。 确实需要一个额外的控制+控制源,在我们的例子中,有一个附近的复选框而不是灰色的按钮是客户可以接受的。谢谢!【参考方案2】:

据我了解您的问题,您有一个连续的表单,每行都显示命令按钮 - 您希望根据行的内容有条件地启用/禁用该按钮。

很遗憾,您不能这样做。您似乎无法单独引用各个命令按钮。

过去我想做类似的事情,我想出了两种设置界面的替代方法。

    在按钮的 onClick 代码中设置一个陷阱。这很恶心,因为它对用户来说是反直觉的。但它现在为您提供了该功能。 将命令按钮(和可编辑字段)向上移动到表单标题中,并使行只读。然后,您的用户仅在标题中与记录交互,并在下面的列表中选择他们想要使用的记录。我记得这被称为 Master-Detail 界面。

【讨论】:

这是一个带有页眉、重复细节和页脚的表单。关于。 1,仅此而已。有一些可点击的东西告诉你它是否可点击(非空)就像显示空订单一样糟糕,这是我想要阻止的。关于。 2、改变UI现在不是一个选项。 Re #1 - 正如我所说的 - 这很恶心。回复:#2 - 每种技术都有其局限性,这就是其中之一。

以上是关于使用 VBA 代码有条件地使表单行的(详细信息)按钮变灰的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Access VBA 中从另一个窗体调用一个窗体的 Form_Load

如何使用角度指令动态地使表单元素只读?

报告格式化 VBA 代码

用户表单组合框大小 - VBA

使用 VBA 在 Access 中重新查询子表

MS Access vba 保存按钮错误 3021