【问题标题】:Linking a form to multiple list boxes将表单链接到多个列表框
【发布时间】:2014-11-23 20:44:02
【问题描述】:

我有一个包含三个列表框和一个子表单的主表单。我想建立一个允许我在子表单和三个列表框之间切换链接的例程。这可能吗?还是我必须创建同一个子表单的三个副本并隐藏两个而另一个激活?

为了实用,我的表单会这样工作:子表单包含参与项目的人员的记录列表、他们的具体角色以及他们来自哪个内部团队。我想使用三个列表框来允许用户通过以下任一方式过滤此表单:

(1) 来自某个团队的所有参与者 (2) 所有参与者按角色(职务) (3) 按参与者名称过滤

我的不足之处是如何重新链接子表单上的过滤器,以便当用户从一个过滤器传递到另一个过滤器时,它会从一个列表框变为另一个列表框。

使用下面 Krish 的建议作为一个简单的测试,我正在尝试以下代码,但在记录源行上收到一条编译错误消息,指出无法找到方法或数据成员。不知道这意味着什么:

Private Sub lstRoles_AfterUpdate()

Dim SQL_GET As String
SQL_GET = "SELECT * from tblProjectGovernanceResources where ((role like '" & lstRoles.Value & "')"
Me.frmProjectGovernanceResources.RecordSource = SQL_GET

End Sub

【问题讨论】:

  • 请更具体地说明您想要实现的目标,表单的行为方式。
  • 我编辑了解释。谢谢
  • 您将向每个列表框的“更新后”事件添加代码。在代码中,创建所需的过滤器(您的“WHERE”子句),然后创建所需的 SQL,并更新子表单的 RECORDSOURCE。即'select * from Table1 where MyID = 'xxxx';'
  • 谢谢韦恩。所以我的理解是,也许我必须在基础表(记录)中创建一个列来标记列表框选择的记录,并根据我在记录源上创建的标记在我的表单上进行过滤?您是否也能快速解释一下使用列表框识别该值的最佳方式?我的初学者级直觉告诉我,我必须使用 DAO 从列表框中获取唯一 ID,将其存储在某处,然后更新我的记录源?很抱歉造成混乱。
  • 您的表格应该已经包含您要过滤的三个字段;如果不是,那么为不存在的项目提供列表框对我来说毫无意义。这些字段可能都在同一个表中,也可能在相关表中。假设您为子表单定义了一个查询并且它具有这些字段,我将使用 VBA 代码根据选择更改 WHERE 子句(或表单过滤器)。给我一点时间,我会发布一些代码。

标签: ms-access vba ms-access-2010


【解决方案1】:

您可以简单地通过 listbox1.value 从列表框中检索选定的值。 正如韦恩 G 指出的那样。您可以在 listbox_after_update 事件中添加代码来更新子表单的记录源。

类似:

dim SQL_GET as string
sql_get = "SELECT * from tbl_myTAble where ((condition like '" & listbox1.value & "') OR (condition2 like '"& listbox2.value &"') OR (condition3_number like "& listbox3.value &"))

me.mysubform.recordsource = sql_Get

显然,您需要根据自己的要求进行改进。 试试这个,为了得到更好的答案,产生你迄今为止编码的东西..

【讨论】:

  • 如此简单,但用户使用。谢谢克里希。
  • Krish,我对你出色的职业生涯表示敬意(我查看了你的博客)。我正在寻找你的电子邮件地址,因为我想问你几个我认为你可能感兴趣的问题我认为我们的职业抱负非常一致。我想知道,如果我们交换一些话,你介意吗? Andrew MarcheseIlChihuahua@gmail.com
  • 先生们,我已经尝试添加代码,但它在记录源上返回错误消息。我在上面列出了。
  • @MarcheseIlChihuahua 是的,我们可以:) krishkm@outlook.com
【解决方案2】:

我为最简单的版本创建了一些代码。这意味着您的所有列表框都将“多选”属性设置为“无”(这意味着您不能在列表中选择多个项目,也不能通过再次单击来“取消选择”一个项目。我确实添加了最后的一些代码,以便您可以看到不同的多选选项如何工作。

我的表单有三个列表框、一个子表单和两个按钮。一键清除所有列表框中的所有选择。另一个按钮将过滤器应用于子表单。

Option Compare Database
Option Explicit

'*** NOTE!!! THIS CODE ASSUMES YOU HAVE SET YOUR LISTBOX PROPERTY to 'NONE'.

' IF YOU SET 'MULTI SELECT' To 'SIMPLE' or 'EXTENDED', you MUST use different code to find all selected items.

Dim strWhereTeam        As String
Dim strWhereRole        As String
Dim strWhereParticipant As String

Private Sub cmdClear_Click()
' Clear all selections in all listboxes
Dim i   As Integer
    For i = 0 To Me.lstParticipant.ListCount        'Deselect ALL rows in Listbox
        lstParticipant.Selected(i) = False
    Next i
    For i = 0 To Me.lstRole.ListCount               'Deselect ALL rows in Listbox
        lstRole.Selected(i) = False
    Next i
    For i = 0 To Me.lstTeam.ListCount               'Deselect ALL rows in Listbox
        lstTeam.Selected(i) = False
    Next i
    strWhereTeam = ""
    strWhereRole = ""
    strWhereParticipant = ""
    Me.MySubForm.Form.Filter = ""                   ' Reste filter to NONE
    Me.MySubForm.Form.FilterOn = False
End Sub

Private Sub cmdFilter_Click()
'Build Filter (concatenate three selections)
Dim strFilter   As String
    strFilter = ""
    If strWhereTeam & "" <> "" Then
        strFilter = strWhereTeam
        If strWhereRole & "" <> "" Then
            strFilter = strFilter & " AND " & strWhereRole
            If strWhereParticipant & "" <> "" Then
                strFilter = strFilter & " AND " & strWhereParticipant
            End If
        Else
            If strWhereParticipant & "" <> "" Then
                strFilter = strFilter & " AND " & strWhereParticipant
            End If
        End If
    ElseIf strWhereRole & "" <> "" Then
        strFilter = strWhereRole
        If strWhereParticipant & "" <> "" Then
            strFilter = strFilter & " AND " & strWhereParticipant
        End If
    ElseIf strWhereParticipant & "" <> "" Then
        strFilter = strWhereParticipant
    End If

    If strFilter = "" Then
        Me.MySubForm.Form.Filter = ""
        Me.MySubForm.Form.FilterOn = False
    Else
        Me.MySubForm.Form.Filter = strFilter
        Me.MySubForm.Form.FilterOn = True
    End If
End Sub

Private Sub lstParticipant_Click()
    strWhereParticipant = "[Participant] = '" & Me.lstParticipant.ItemData(Me.lstParticipant.ListIndex) & "'"
    Debug.Print strWhereParticipant
End Sub

Private Sub lstRole_Click()
    strWhereRole = "[Role] = '" & Me.lstRole.ItemData(Me.lstRole.ListIndex) & "'"
    Debug.Print strWhereRole
End Sub

Private Sub lstTeam_Click()
    If Me.lstTeam.MultiSelect <> 0 Then
        MsgBox "You have set the 'Multi Select' property to either Simple or Extended. This code may not work!", vbOKOnly + vbCritical, "ListBox MultiSelect not 'None'"
    End If
    strWhereTeam = "[Team] = '" & Me.lstTeam.ItemData(Me.lstTeam.ListIndex) & "'"
    Debug.Print strWhereTeam
    'Simple_Code
End Sub

'' Sample code if set 'Multi Select' to 'Simple' or 'Extended'
'Sub Simple_Code()
'    Dim var       As Variant
'    strWhereTeam = ""
'    For Each var In Me.lstTeam.ItemsSelected
'        strWhereTeam = strWhereTeam & "[Team] = '" & Me.lstTeam.ItemData(var) & "' OR "
'    Next var
'    strWhereTeam = "(" & left(strWhereTeam, Len(strWhereTeam) - 4) & ")"
'    Debug.Print strWhereTeam
'End Sub

【讨论】:

  • 谢谢韦恩。太棒了..当我有精力时,我会尽快完成。乍一看,您似乎已经涵盖了一些我真正想确定的重要概念。
【解决方案3】:

非常感谢!这一切都做到了!

私有子 lstRoles_AfterUpdate()

将 SQL_GET 调暗为字符串 SQL_GET = "SELECT * from tblProjectGovernanceResources where ([role] = '" & lstRoles.Value & "')"

Me.frmProjectGovernanceResources.Form.RecordSource = SQL_GET

结束子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多