我已经创建了一个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
答案 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的可见性。
请注意,这在连续或数据表视图中不起作用。但是,可以使用条件格式设置组合框启用属性,这将在连续和数据表视图中工作。
建议您为组合框提供更有意义的名称。