1

我在表单(用户)中嵌入了一个子表单(用户子表单)。我想要实现的是在加载时,子窗体应该显示表中的所有用户,主窗体上的控件作为过滤器。
即如果从主窗体的组合框中选择了用户A, 如果从主窗体的组合框中清除选择(即userA)
,则仅在子窗体中显示用户A的详细信息,所有记录将再次在子窗体中弹出。

这听起来很简单,但对于初学者来说,当我加载表单时,子表单中只显示 1 条记录,如果我在用户组合框中进行选择,则该用户的记录仅显示。如果我只能看到一个记录,无论是否进行选择,它都违背了拥有子表单的目的。

我正在使用 Access '03。有人能帮忙吗。我在这里有一个示例数据库,它已经成功地实现了这一点,但与我的相比,我似乎无法发现它们的设置有什么不同。

4

4 回答 4

3

主窗体不应该有记录源,也不应该有链接条件。

过滤器控件的更新后事件应该更新子表单的过滤器(正如 CodeSlave 的代码所做的那样),您可以分配子表单的记录源(我倾向于后者,因为这样我就不必担心所有过滤器带来的问题)。

我过去曾多次这样做,但通常不使用子表单。我不喜欢数据表并使用连续表单,并将过滤控件放在表单的标题中。然后,您避免了引用子表单控件的困难(尽管这很容易,因为您可以使用 With/End With 块,如 Praesagus 的帖子中所见)。

关键是您想要主表单 UNBOUND 并且您想要放置条件的控件来触发子表单的过滤。

于 2009-06-13T12:45:36.237 回答
2

我假设您将子表单设置为“连续表单”或“数据表”。

当您的表单打开时,您的过滤器中是否还有内容?您可能希望在主表单打开时显式清除它,然后刷新数据。

编辑
这是我以前做过的事情:

Private Sub cmdCannedFilter_Click()
On Error GoTo Err_Click    
Dim strFilter As String
    strFilter = "(1 = 1)"
    strFilter = strFilter & " " & _
            "and (((someTable.Active)=Yes) "   

    Me![List_SubForm].Form.FilterOn = False
    Me![List_SubForm].Form.Filter = strFilter
    Me![List_SubForm].Form.FilterOn = True

Exit_Click:
    Exit Sub

Err_Click:
    MsgBox Err.Description
    Resume Exit_Click
End Sub

在这种情况下,这是从主窗体上的按钮运行的,并且List_SubForm(显然)是子窗体。我认为对我来说关键是必须关闭过滤器然后再打开。我不记得为什么。

(1 = 1)是因为我在其他地方做了类似的事情,我在他们飞行时建立查询,这意味着我不必每次都决定是否需要and在那里插入。

你在做类似的事情吗?

于 2009-06-10T21:55:27.887 回答
1

听起来您在这里有两个不同的记录集。选择用户时显示用户详细信息。未选择任何用户时,您希望查看所有用户。如果是这种情况,请使用两个子表单并在它们之间切换——我们将它们称为 fAllUsers 和 fUserDetails。让我们调用子窗体控件名称 sfUser。我假设用户表单上的主键和 fUserDetails 上的外键是用户 ID。确保子表单没有与父表单链接的任何字段。
在父级中:

Private Sub Form_Current()
    Dim sForm as string
    Dim sFilter as string
    Dim lUserID as long
    lUserID =nz(me!userID,0)
    sForm="fUserDetails"
    sFilter="userID=" & lUserID
    if lUserID<>0 then 
        sForm="fAllUsers"
        sFilter=""
    end if
    with sfUser
        .sourceobject=sForm
        .filter=sFilter
        .filteron=true
    end with
End Sub

希望有帮助。

于 2009-06-12T20:34:37.630 回答
0

我有一个名为“TmprryQryFrLnkFldsCrtn0123456789”的随机(咒骂)查询,我错误地删除了它,这给了我一个问题,即我的子表单上只显示了一条记录。我只是碰巧将我拥有的备份数据库与我遇到问题的备份数据库进行了比较。

一旦我恢复了查询,我的所有结果都会再次出现。

于 2013-05-29T19:30:42.220 回答