forms - MSACCESS - 如何按条件一次自定义所有 Switchboard 条目文本
问题描述
我有一个由 MS Access 生成的默认 Switchboard,我想一次自定义列表中的每个条目。
Switchboard 表单默认设置为“连续表单”,条目的控件是一个文本框 ( ItemText
),通过 VBA 标识为OptionLabel1
.
我在默认的“Switchboard Items”表中添加了一个名为“ SecLevel
”的新字段,我在其中为每个条目/记录添加了一个值,例如Admin
,Operator
和User
.
现在,我希望 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
这不起作用帮助..
解决方案
错误
Dlookup
的标准。您想获取SecLevel
与存储在Switchboard Item
相同的. 采用:Item Number
TempVars!CurrentItemNumber.Value
DLookup("[SecLevel]", "Switchboard Items", "[Item Number] = TempVars!CurrentItemNumber.Value")
或
TempVars!CurrentItemNumber.Value
转换为 True(如果 <> 0,则获取第一个值,因为所有行的条件都为真) ot False(如果 = 0,则不获取任何值)错误的事件。
Form_Current
每次将表单记录集光标移动到另一条记录时都会触发事件。要在表单启动时执行代码,Form_Open
请在不需要来自绑定查询/字段的值时使用(例如,检查 priviligdes 并在 priv 不足时关闭),因为它会在获取数据之前触发。但是由于您需要[ItemNumber].Value
使用Form_Load
事件(在加载带有数据的表单时触发。在连续表单上,为每条记录复制详细信息部分内的控件,但仍然具有相同的名称。In
Form_Current
eventMe.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-notation
OptionLabel1
是一个糟糕的标识符,没有告诉我们任何有用的东西。查看变量名以获得一些好的信息(也请查看网站的其余部分,因为它包含许多好的建议!)。在表/字段名称中避免特殊字符,只使用字母、数字和下划线,那么你不需要方括号!还要习惯于重命名从查询/表中删除的控件,否则控件和数据字段的名称相同会导致一些麻烦!关于 vba 编码的另一个重要资源是RubberduckVBA插件(试试看:))和他们的博客。即使他们非常关注 Excel,也没有更好的资源来学习 OOP vba 编码。也许从坏习惯开始然后继续你喜欢的地方(我推荐OOP Battleship Part 1: The Patterns)
推荐阅读
- python - 斯坦中的“错误:模型块中不存在变量“真实”
- python - 在 GEE Python API 的 inner.Join 函数中使用过滤器函数
- sql-server - 如何将第二行移动到sql中的列?
- javascript - 使用 cocoon gem 为每个项目添加唯一 ID - Ruby On Rails
- java - ElasticSearch 使用 Java RestHighLevelClient 使用 BulkRequest API 索引 100K 文档
- for-loop - Android Kotlin 用 for next 循环替换 while
- c++ - 为什么 C++ 的 void 类型只是半心半意的单元类型?
- html - 为什么孩子的绝对定位会使父母的身高崩溃?
- python - vscode的python扩展是否支持鸡蛋自动补全?
- php - 如何在 cURL 请求中发送 cookie?