如果没有要显示的项目,则隐藏ComboBox(MSAccess)

时间:2017-09-14 17:38:34

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

我已经创建了一个Access表单,并实现了3"级联组合框",所以基本上,如果用户选择组合框1中的项目,这将过滤组合框2中的项目,然后将过滤组合框3中的项目。

我在VBA中使用此代码执行此操作:

Private Sub ComboBox1_AfterUpdate()

Me.Combobox2.RowSource = "SELECT DISTINCT [Table1].[SubColumn1]" & _
                               "FROM [Table1] " & _
                               "WHERE [Column1] = '" & Combobox1.Value & "' ;"                                
End Sub

这很有效。但是,有些情况下在combobox2中没有可供选择的项目。我的数据在"表1和#34;看起来像这样:

| Column 1      | SubColumn1    | SubColumn2    |
|-------------  |-------------  |-------------  |
| Item 1        | Item 1A       |               |
| Item 1        | Item 1B       |               |
| Item 2        |               |               |
| Item 3        | Item 3A       | Item 3A1      |
| Item 3        | Item 3B       | Item 3B1      |

如您所见,如果用户从combobox1中选择第2项,则在combobox2或combobox3中将没有信息。

在这种情况下,我想修改这段代码,如果在combobox2或3中没有可用的项目,这些组合框就会被隐藏。

我试过在if语句中包装整个表达式,如下所示:

Private Sub ComboBox1_AfterUpdate()
   if isnull(Me.Combobox2.RowSource = "SELECT DISTINCT [Table1].[SubColumn1]" & _
                                   "FROM [Table1] " & _
                                   "WHERE [Column1] = '" & Combobox1.Value & "' ;" ) 
     then me.combobox2.visible = false
     else: me.combobox2.visible = true                               
End Sub

这不起作用,不仅combobox2和3没有消失,而且盒子里现在没有任何物品。

有人可以帮忙吗?

不确定这一切是多么清楚,所以如果我能回答任何问题,请告诉我!

更新

以下是3个组合框的两个宏:

Private Sub ComboCause1_AfterUpdate()

Me.ComboCause2.RowSource = "SELECT DISTINCT [Cause of Injury].[Cause of Injury 2]" & _
                           "FROM [Cause of Injury] " & _
                           "WHERE [Cause of Injury] = '" & ComboCause1.Value & "' ;"
                           If Me.ComboCause2.ListCount < 2 Then
                           Me.ComboCause2.Visible = False
                           Me.ComboCause3.Visible = False
                           Me.Label2695.Visible = False
                           Me.Label2699.Visible = False
                           Else:
                           Me.ComboCause2.Visible = True
                           Me.Label2695.Visible = True
                           End If

End Sub

Private Sub ComboCause2_AfterUpdate()

Me.ComboCause3.RowSource = "SELECT DISTINCT [Cause of Injury].[Cause of Injury 3]" & _
                           "FROM [Cause of Injury] " & _
                           "WHERE [Cause of Injury 2] = '" & ComboCause2.Value & "' ;"
                           If Me.ComboCause3.ListCount < 2 Then
                           Me.ComboCause3.Visible = False
                           Me.Label2699.Visible = False
                           Else:
                           Me.ComboCause3.Visible = True
                           Me.Label2699.Visible = True
                           End If

End Sub

3 个答案:

答案 0 :(得分:2)

您需要做的就是检查ListCount ......如:

If Me.Combobox2.Listcount = 0 then
   Me.Combobox2.Visible = False
Else
   Me.Combobox2.Visible = True
EndIf

答案 1 :(得分:1)

您可以先使用SQL字符串创建记录集,然后在分配行源之前测试记录集是否为空:

Private Sub ComboBox1_AfterUpdate()

Dim rs As DAO.Recordset
Dim strSQL As String

strSQL = "SELECT DISTINCT [Table1].[SubColumn1]" & _
                           "FROM [Table1] " & _
                           "WHERE [Column1] = '" & Combobox1.Value & "' ;"

Set rs = CurrentDb.OpenRecordset(strSQL)

If rs.EOF Then
    Me.Combobox2.Visible = False
Else
    Me.Combobox2.Visible = True
    Me.Combobox2.RowSource = strSQL
End If

Set rs = Nothing

End Sub

IsNull()将无法评估查询结果或组合框中列出的项目数。可以使用.EOF评估记录集,以确定结果是否为空。这可能不是最有效的方法,但它应该完成这项工作。

答案 2 :(得分:1)

在设计中将组合2和3设置为不可见。

在组合1中包含字段2和3作为隐藏列。然后在组合中1 AfterUpdate:

Me.combo2.Visible = Me.combo1.Column(1) <> ""
Me.combo3.Visible = Me.combo1.Column(2) <> ""

然后在组合2中进行类似设置以设置组合3的可见性。

如果您要导航记录,可能还需要OnCurrent事件中的代码来设置组合2和3的可见性。

请注意,这在连续或数据表视图中不起作用。但是,可以使用条件格式设置组合框启用属性,这将在连续和数据表视图中工作。

建议您为组合框提供更有意义的名称。