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 毫秒重复一次的无限循环(但如果该功能有效)
如果过滤后没有记录,如何使用 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 毫秒重复一次的无限循环(但如果该功能有效)