我正在为坚持使用 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
为空。显然我做错了什么,但我没有足够的 Access 经验来知道它是什么。
顺便说一句,另一个建议是做
Text32.SetFocus
在 Access Text 属性之前。这不能解决我提到的错误。它仍然抛出完全相同的错误。有人能在这里指出我正确的方向吗?
最佳答案
正如您所发现的,文本框的 Value
仅在控件失去焦点后设置。
相反,Text
属性仅在控件具有焦点时才可 Access 。Value
属性被定义为控件的默认成员;这意味着 Text32
将与 Text32.Value
隐含相同,但是,根据上下文,Text32
有时可以指控件本身,而不仅仅是它的值。
所有这些差异有时会令人气愤。
回到手头的问题:您有两种处理过滤的方法。
第一种情况,等待用户输入被 ENTER 验证。
假设您的过滤文本框名为
txtFilter
并且位于其子窗体显示要过滤的数据表(或连续窗体)的窗体上。您需要做的就是连接文本框
OnKeyDown
事件如下:' We will only perform the filter if the user press the ENTER key
Private Sub txtFilter_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 13, 9
KeyCode = 0
QuickFilter
End Select
End Sub
' Perform the actual filtering on the subform
Private Sub QuickFilter()
Dim sql As String
Dim filter As String
If txtFilter.Text = vbNullString Then
' Reset the filter if the textbox is emtpy
SubForm.Form.FilterOn = False
Else
'Some common substitutions that users may have already inserted as wildchars
filter = Replace(txtFilter.Text, "%", "*")
filter = Replace("*" & filter & "*", "**", "*")
' We construct the filter SQL
sql = "([JobNumber ] LIKE """ & filter & """)"
sql = sql & " OR ([ProjectCode] LIKE """ & filter & """)"
sql = sql & " OR ([SupplierName] LIKE """ & filter & """)"
'... Add as many columns to filter on as you want
' Assign the filter to the subform
SubForm.Form.filter = sql
SubForm.Form.FilterOn = True
End If
End Sub
第二种情况,输入时过滤
嗯,这相当简单,我们只需要在上述解决方案中添加一种跟踪用户输入变化的方法。
这最好通过
OnChange
来完成。文本框的事件。Private Sub txtFilter_Change()
QuickFilter
End Sub
这就是您需要添加的全部内容。
关于ms-access - MS Access TextBox 值始终为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263456/