【问题标题】:Hiding ComboBox if there are no items to display (MSAccess)如果没有要显示的项目,则隐藏 ComboBox (MSAccess)
【发布时间】:2017-09-15 04:57:24
【问题描述】:

我创建了一个 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 中没有可供选择的项目。我在“Table1”中的数据如下所示:

| 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 中选择了Item 2,combobox2 或combobox3 中将没有任何信息。

既然如此,我可能会修改此代码,如果在组合框 2 或 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

【问题讨论】:

  • ComboCause1_AfterUpdate 的 If 语句中,我认为您需要删除组合 3 测试。我真的不明白那里的逻辑。在 ComboCause2_AfterUpdate 的 If 语句中,您需要将 And 更改为 Or
  • 开始工作了!如果您想看一下,我对原始编辑进行了一些更改。一切似乎都在工作!感谢大家的帮助!

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


【解决方案1】:

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

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

【讨论】:

  • 我真的很喜欢这段代码,但我遇到了一个问题:combobox3 似乎不想消失。所以如果没有combobox2,就应该没有combobox3。如果有一个combobox2,但combobox3中没有项目,combobox3应该消失。我已经更新了我的代码。可以看看吗?
  • 看起来你自己想出了这个...我给你一个示例,说明如何隐藏/显示基于另一个组合框的任何组合框。要级联到更多组合,只需像在更新后的帖子中那样添加代码。 :)
【解决方案2】:

你可以先用你的 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 评估记录集以确定结果是否为空。这可能不是最有效的方法,但它应该可以完成这项工作。

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    建议你给组合框起更有意义的名字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多