【发布时间】:2013-08-15 23:16:37
【问题描述】:
我正在为坚持使用 MS Access 的人做一些工作。我通常不使用它,所以我对整个控制结构和最佳实践有点陌生。我想要实现的是在表单上有一个过滤器文本框,当输入一个值时,它将过滤详细信息部分中的行。这似乎是一个简单的用例。我最初尝试以下行为作为 On Change 事件的事件处理程序:
Private Sub FilterGrid()
Me.Text32.SetFocus
If Not IsNull(Me.Text32.Text) And Me.Text32.Text <> "" Then
Me.Filter = "JobNumber LIKE '*" & Me.Text32.Text & "*'"
Me.FilterOn = True
End
Else
Me.FilterOn = False
End If
End Sub
这非常有效,直到我输入了一些没有任何行匹配的内容并且整个事情都因这个错误而爆炸(并且在不关闭表单的情况下无法恢复): 运行时错误“2185”:除非控件具有焦点,否则不能引用控件的属性或方法。
我做了一些阅读,普遍认为不应使用 .Text 而应使用 .Value(或只是没有属性的 Text32)。这产生了一些非常奇怪的行为。 Text32.Value 始终为空。我有一个监视窗口,我可以看到对于正常行为,Text32.Text 有一个实际值,但Text32.Value 是 NULL。
显然我做错了什么,但我没有足够的 Access 经验来知道它是什么。
顺便说一句,另一个建议是在访问 Text 属性之前执行Text32.SetFocus。这并不能解决我提到的错误。它仍然会抛出完全相同的错误。
有人可以在这里为我指明正确的方向吗?
【问题讨论】:
-
not = ""是否产生相同的行为?或 "" -
只是另一个更新。我继续测试。在控件失去焦点之前,文本框的 Value 属性似乎不会更新。我已经在控件注册的每个事件上测试了 Value 属性,它唯一一次正确显示我在文本框中“更改”的内容是在 AfterUpdate 事件中,一旦我单击该文本框之外的某个位置。这可以通过添加一个必须单击的“搜索”按钮轻松解决,但我发现这不是一个好的用户体验。如果它在输入时进行过滤会更好。 (我知道存在性能问题)。
标签: ms-access vba ms-access-2010