Access 2010 - 错误处理过滤器子表单

Access 2010 - Error Handling Filter Subform

如果过滤后没有记录,如何使用 VBA 禁用 Datagridview 的过滤器?

这是我的第一次尝试:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    If Me.RecordsetClone.RecordCount = 0 Then
        MsgBox ("Kein Datensatz gefunden. Filter wird entfernt.")
        Me.Form.FilterOn = False
        Me.Form.Requery
    End If
End Sub

这是第二次尝试:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    Dim rs As DAO.Recordset

    Set rs = Me.RecordsetClone
    rs.Filter = Replace(Me.Filter, "[Tabelle1].", "")
    Set rs = rs.OpenRecordset()

    If rs.EOF Then
        Cancel = True
    End If
End Sub

在第二个代码中,我得到错误 3061。第一个代码 "works",但最终我不需要。

因为:

我有 3 个表格。主、Sub1 和 Sub2。

MAIN 中有 Sub1 、 Sub2 和一个 TextBox。文本框调用 "psoudoID"。 Sub1 是显示不同记录集详细信息的普通表单,位于 MAIN 的顶部。 Sub1 下面是 Sub2。 Sub2 是一个数据网格视图。当用户单击 Sub2 上的记录集时,ID 从 Sub2 "goes" 到 psoudoID,然后从那里到 Sub1。你明白?

现在的问题是,用户可以过滤 Datagrid 中的每一列以找到此处需要的记录集并显示上面的所有详细信息。但是当过滤后数据网格为空时,Sub2 无法为 psoudoID 提供 ID,因此 Sub1 不再显示在 MAIN 中。那个地方的屏幕是空的。通过单击网格中的过滤器按钮,Sub1 再次出现在屏幕上。

我想通过单击 MsgBox 的 "Ok" 或自动禁用过滤器,而不是通过单击 gridview 上的过滤器按钮。

希望您能理解我的描述。抱歉我的英语不好:-)

谢谢。

贝吉塔

我相信您遇到过滤器 Null 以及在实际应用过滤器之前使用 Me.Filter 的问题。另外,将一个对象重新分配给一个 property/member 本身已经给我带来了问题,所以我尽量避免这样做。

以下应该有效:

Dim strOldFilter As String
Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    Me.TimerInterval = 50
    strOldFilter = Nz(Me.Filter, "")
End Sub

Private Sub Form_Timer
        Me.TimerInterval = 0
        If Me.Filter = strOldFilter Then Exit Sub
        Dim rs As DAO.Recordset
        Dim strFilter As String
        strFilter = Nz(Me.Filter, "")
        If strFilter = "" Then
            'Handle this specific scenario
             Exit Sub
        End if
        Set rs = Me.RecordsetClone
        rs.Filter = Replace(strFilter, "[Tabelle1].", "")
        Dim rsf as DAO.Recordset
        Set rsf = rs.OpenRecordset

        If rsf.EOF Then
            Me.Filter = strOldFilter
        End If
End Sub

请注意,如果您将导致 0 条记录的过滤器更改为导致 0 条记录的另一个过滤器,则可能会导致每 50 毫秒重复一次的无限循环(但如果该功能有效)