首页 > 解决方案 > MSACCESS - 如何按条件一次自定义所有 Switchboard 条目文本

问题描述

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

Switchboard 表单默认设置为“连续表单”,条目的控件是一个文本框 ( ItemText),通过 VBA 标识为OptionLabel1.

我在默认的“Switchboard Items”表中添加了一个名为“ SecLevel”的新字段,我在其中为每个条目/记录添加了一个值,例如Admin,OperatorUser.

现在,我希望 Switchboard 表单列表中的每个项目根据“ SecLevel”值更改其文本颜色,例如管理员为红色,操作员为蓝色。

所以我尝试这样:

Private Sub Form_Current()

TempVars!CurrentItemNumber.Value = [ItemNumber].Value

Dim ctrl As control
For Each ctrl In Me.Controls

If ctrl.Name = "OptionLabel1" Then

    If DLookup("[SecLevel]", "Switchboard Items", TempVars!CurrentItemNumber.Value) = "Admin" Then
        
        Me.OptionLabel1.ForeColor = RGB(255, 0, 0)
    
    ElseIf DLookup("[SecLevel]", "Switchboard Items", TempVars!CurrentItemNumber.Value) = "Operator" Then
        Me.OptionLabel1.ForeColor = RGB(0, 0, 255)
    
    Else
    
        Me.OptionLabel1.ForeColor = RGB(0, 0, 0)
    End If
End If
Next
End Sub

这不起作用帮助..

标签: formsms-access

解决方案


  1. 错误Dlookup的标准。您想获取SecLevel与存储在Switchboard Item相同的. 采用:Item NumberTempVars!CurrentItemNumber.Value

    DLookup("[SecLevel]", "Switchboard Items", "[Item Number] =  TempVars!CurrentItemNumber.Value") 
    

    TempVars!CurrentItemNumber.Value转换为 True(如果 <> 0,则获取第一个值,因为所有行的条件都为真) ot False(如果 = 0,则不获取任何值)

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

  3. 在连续表单上,为每条记录复制详细信息部分内的控件,但仍然具有相同的名称。In Form_CurrenteventMe.OptionLabel1总是指实际选择行中的控件。所有其他副本不受影响。要解决使用条件格式或使用Detail_Paint事件。

其他一些改进可以是:

  • 如果您知道控件名称,则无需循环整个控件集合,只需使用Me.Controls("NameOfControl").

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

    Select Case DLookup("[SecLevel]", "Switchboard Items", "[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
    

    如果设置了通常的选项比较数据库,请注意不区分大小写的字符串比较。

  • 使用正确的命名约定!即使你似乎不倾向于丑陋的 ungarian-notationOptionLabel1是一个糟糕的标识符,没有告诉我们任何有用的东西。查看变量名以获得一些好的信息(也请查看网站的其余部分,因为它包含许多好的建议!)。在表/字段名称中避免特殊字符,只使用字母、数字和下划线,那么你不需要方括号!还要习惯于重命名从查询/表中删除的控件,否则控件和数据字段的名称相同会​​导致一些麻烦!关于 vba 编码的另一个重要资源是RubberduckVBA插件(试试看:))和他们的博客。即使他们非常关注 Excel,也没有更好的资源来学习 OOP vba 编码。也许从坏习惯开始然后继续你喜欢的地方(我推荐OOP Battleship Part 1: The Patterns


推荐阅读