2

我正在为坚持使用 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 经验来知道它是什么。

顺便说一句,另一个建议是 Text32.SetFocus在访问 Text 属性之前立即执行。这并不能解决我提到的错误。它仍然抛出完全相同的错误。

有人能在这里指出我正确的方向吗?

4

2 回答 2

3

正如您所发现的,Value仅在控件失去焦点后才设置文本框。
相反,Text只有在控件具有焦点时才能访问该属性。

Value属性被定义为控件的默认成员;这意味着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

第二种情况,在输入时过滤

好吧,这相当简单,我们只需要在上述解决方案中添加一种在用户键入时跟踪更改的方法。
这最好通过OnChangetexbox 事件来完成。

Private Sub txtFilter_Change()
    QuickFilter
End Sub

这就是您需要添加的全部内容。

于 2013-08-16T04:17:05.317 回答
0

不要使用 .text 属性,而是使用 .value 属性

text3.value=text1.value+text2.value

您不需要每次都像 .text 属性那样设置焦点。

它工作得很好....vba ms 访问

于 2022-01-24T15:10:50.580 回答