MSACCESS-如何根据条件一次自定义所有“总机”条目文本

问题描述

我有一个由MS Access生成认总机,我想一次自定义列表的每个条目。

“配电盘”表单认设置为“连续表单”,并且条目的控件是一个文本框(ItemText),该文本框通过VBA标识为OptionLabel1

我在认的“总机项目”表中添加一个名为“ SecLevel”的新字段,在该字段中,我为每个条目/记录都添加了诸如AdminOperator和{{1 }}。

现在,我希望“总机”表单列表中的每个项目都基于“ User”值更改其文本颜色,例如Admins为红色,Operators为蓝色。

所以我尝试这样:

SecLevel

这不起作用。

解决方法

  1. 错误的Dlookup条件。您要使用与SecLevel中存储的相同的Switchboard Item来获取Item Number的{​​{1}}。使用:

    TempVars!CurrentItemNumber.Value

    DLookup("[SecLevel]","Switchboard Items","[Item Number] = TempVars!CurrentItemNumber.Value") 转换为True(如果 0,则获取所有值,因为所有行的条件都为true)ot False(如果= 0,则不获取任何值)

  2. 错误事件。每次将表单记录集光标移动到另一个记录时,都会触发TempVars!CurrentItemNumber.Value事件。要在表单启动时执行代码,如果您不需要绑定查询/字段中的值(例如,检查特权并在特权不足时将其关闭),请使用Form_Current,因为它会在获取数据之前触发。 但是当您需要Form_Open使用[ItemNumber].Value事件时(加载带有数据的表单时会触发。

  3. 在连续的Form上,Details-Section中的控件将为每条记录复制,但名称仍相同。在Form_Load事件中,Form_Current始终引用实际选择的行中的控件。所有其他副本均不受影响。 要解决此问题,请使用Conditional Formatting或使用Me.OptionLabel1事件。

其他一些改进可以是:

  • 如果您知道控件名称,则无需循环整个Controls集合,只需使用Detail_Paint进行引用即可。

  • 使用Select Case来区分表达式的不同值。例如

    Me.Controls("NameOfControl")

    如果设置了常规的Option Compare Database,请注意不区分大小写的字符串比较。

  • 使用正确的命名约定!甚至您似乎都不会倾向于丑陋的ungarian符号Select Case DLookup("[SecLevel]","[Item Number] = " & TempVars!CurrentItemNumber.Value) Case "Admin" ' ' code on Admin here Case "Operator" ' code on Operator here Case Else ' code executed if no match in cases End Select 是一个很差的标识符,没有告诉我们任何有用的东西。有关一些良好的信息,请参见variable names(也请检查网站的其余部分,因为它包含很多好的建议!)。在表/字段名称中,避免使用特殊字符,只需使用字母,数字和下划线,则不需要方括号!还习惯于重命名从查询/表中删除的控件,否则控件和数据字段的名称相同,这可能会引起麻烦!关于vba编码的另一个重要资源是RubberduckVBA插件(尝试:))和他们的博客。即使他们非常关注Excel,也没有更好的资源来学习OOP vba编码。也许从bad habbits开始,然后继续在您喜欢的位置(我建议OOP Battleship Part 1: The Patterns