Ms access MS Access文本框值始终为空
我正在为坚持使用MS Access的人做一些工作。我通常不使用它,所以我对整个控制结构和最佳实践有点陌生。我试图实现的是在表单上有一个过滤器文本框,当输入值时,它将过滤细节部分中的行。这似乎是一个简单的用例。我最初尝试了以下行为作为On Change事件的事件处理程序:Ms access MS Access文本框值始终为空,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,我正在为坚持使用MS Access的人做一些工作。我通常不使用它,所以我对整个控制结构和最佳实践有点陌生。我试图实现的是在表单上有一个过滤器文本框,当输入值时,它将过滤细节部分中的行。这似乎是一个简单的用例。我最初尝试了以下行为作为On Change事件的事件处理程序: Private Sub FilterGrid() Me.Text32.SetFocus If Not IsNull(Me.Text32.Text) And Me.Text32.Text <> ""
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
Private-Sub-FilterGrid()
Me.Text32.SetFocus
如果不为null(Me.Text32.Text)和Me.Text32.Text“”,则
Me.Filter=“类似于“*”的作业编号&Me.Text32.Text&“*”
Me.FilterOn=正确
终点
其他的
Me.FilterOn=False
如果结束
端接头
在我键入没有任何行匹配的内容之前,这一切都很顺利,整个过程因此错误而爆发(并且在不关闭表单的情况下无法恢复):
运行时错误“2185”:除非控件具有焦点,否则无法引用控件的属性或方法
我在周围读了一些书,一般的意见是不应该使用.Text,而应该使用.Value(或者只是没有属性的Text32)。这产生了一些非常奇怪的行为。Text32.Value
始终为空。我有一个监视窗口,可以看到对于正常行为,Text32.Text
有一个实际值,但Text32.value
为空
显然我做错了什么,但我没有足够的经验去了解它是什么
另一个建议是在访问Text属性之前执行Text32.SetFocus
。这并不能解决我提到的错误。它仍然抛出完全相同的错误
有人能在这里为我指出正确的方向吗?正如您所发现的,文本框的
值只有在控件失去焦点后才会设置。
相反,只有控件具有焦点时才能访问Text
属性
值
属性被定义为控件的默认成员;这意味着Text32
与Text32.Value
隐式相同,但是,根据上下文的不同,Text32
有时可以引用控件本身,而不仅仅是其值
所有这些差异有时会令人愤怒
回到手头的事情:处理过滤有两种方法
- 如果要筛选的列表很大,用户最好键入他们的筛选器,然后按ENTER键进行验证
- 如果列表不太大,可以在键入时实现筛选器
第一种情况,等待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
第二种情况,键入时进行筛选
这相当简单,我们只需要在上述解决方案中添加一种方法,以便在用户键入时跟踪更改。
这最好通过texbox的OnChange
事件来完成
Private Sub txtFilter_Change()
QuickFilter
End Sub
这就是您需要添加的所有内容。是否not=“”
会产生相同的行为?或者“”只是另一个更新。我继续测试。在控件失去焦点之前,textbox的Value属性似乎不会更新。我已经在控件注册的每个事件上测试了Value属性,它在文本框中正确显示我“更改”的内容的唯一时间是在我单击文本框之外的某个位置后,在AfterUpdate事件中。这可以通过添加一个必须点击的“搜索”按钮轻松解决,但我发现这不是一个好的用户体验。如果它能按他们输入的内容过滤,那就更好了。(我知道存在性能问题)。