Ms access 子窗体仅显示单个记录

Ms access 子窗体仅显示单个记录,ms-access,records,subform,Ms Access,Records,Subform,我在表单(用户)中嵌入了一个子表单(用户子表单)。我试图实现的是加载,子窗体应显示表中的所有用户以及主窗体上的控件,以用作筛选器。 i、 e. 如果从主窗体的组合框中选择了用户A,则子窗体中只显示用户A的详细信息 如果在主窗体的组合框中清除了选择(即userA),则子窗体中将再次弹出所有记录 这听起来很简单,但对于初学者来说,当我加载表单时,子表单中只显示1条记录,如果我在用户组合框中进行选择,则该用户的记录只显示。如果我所能看到的只是一次录制一个子窗体,无论是否进行选择,它都会破坏创建子窗体的

我在表单(用户)中嵌入了一个子表单(用户子表单)。我试图实现的是加载,子窗体应显示表中的所有用户以及主窗体上的控件,以用作筛选器。
i、 e.
如果从主窗体的组合框中选择了用户A,则子窗体中只显示用户A的详细信息
如果在主窗体的组合框中清除了选择(即userA),则子窗体中将再次弹出所有记录

这听起来很简单,但对于初学者来说,当我加载表单时,子表单中只显示1条记录,如果我在用户组合框中进行选择,则该用户的记录只显示。如果我所能看到的只是一次录制一个子窗体,无论是否进行选择,它都会破坏创建子窗体的目的


我正在使用Access'03。有人能帮忙吗。我这里有一个样本数据库,它成功地实现了这一点,但我似乎找不到它们的设置与我的有什么不同

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

当窗体打开时,筛选器中是否仍有内容?您可能希望在主窗体打开时显式清除它,然后刷新数据

编辑
以下是我以前做过的一些事情:

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\u子窗体
显然是子窗体。我想对我来说最关键的是必须关闭过滤器,然后再打开。我不记得为什么了

(1=1)
是因为我在其他地方做了类似的事情,在那里我正在动态构建查询,这意味着我不必每次都决定是否需要在那里插入


您正在做类似的事情吗?

我想您已经将子表单设置为“连续表单”或“数据表”

当窗体打开时,筛选器中是否仍有内容?您可能希望在主窗体打开时显式清除它,然后刷新数据

编辑
以下是我以前做过的一些事情:

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\u子窗体
显然是子窗体。我想对我来说最关键的是必须关闭过滤器,然后再打开。我不记得为什么了

(1=1)
是因为我在其他地方做了类似的事情,在那里我正在动态构建查询,这意味着我不必每次都决定是否需要在那里插入


你在做类似的事情吗?

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

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
Private子表单_Current()
像绳子一样模糊
作为字符串的Dim sFilter
淡黄如长
lUserID=nz(me!userID,0)
sForm=“fUserDetails”
sFilter=“userID=”&lUserID
如果是lUserID0那么
sForm=“用户”
sFilter=“”
如果结束
与sfUser
.sourceobject=sForm
.filter=sFilter
.filteron=true
以
端接头

希望这能有所帮助。

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

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
Private子表单_Current()
像绳子一样模糊
作为字符串的Dim sFilter
淡黄如长
lUserID=nz(me!userID,0)
sForm=“fUserDetails”
sFilter=“userID=”&lUserID
如果是lUserID0那么
sForm=“用户”
sFilter=“”
如果结束
与sfUser
.sourceobject=sForm
.filter=sFilter
.filteron=true
以
端接头

希望对您有所帮助。

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

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

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


关键的一点是,您希望主窗体解除绑定,并且希望在其中放入条件的控件触发子窗体的筛选。

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

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

我以前做过很多次,但通常不使用子表单。我不喜欢数据表,使用连续表单,并将过滤控件放在表单的标题中。然后,您就可以避免引用子窗体控件的困难(尽管这很简单)