动态填充和更新组合框中的项目

时间:2015-12-01 13:35:19

标签: vba combobox access-vba

我正在制作一个创建课程安排的项目。我正在开发Access。所以,假设我已经创建了一些课程表。现在我想使用与表数据绑定的组合框。我设法做到了这一点。但我的问题是例如。如果我在第一个组合框中选择一个课程,我希望在第二个组合框中禁用该课程,以便我无法选择它。等等每个组合框(假设为六个组合框执行此操作)

我有这个代码。但我的代码的问题是,每当我在第三个组合框中选择某些内容时,我的数据都会从上面的组合框中删除。

 Private Sub cboMonday_AfterUpdate()
    Me.cboTuesday.RowSource = "SELECT CourseName FROM" & _
                               " tblCourses "

    Me.cboWednesday.RowSource = "SELECT CourseName FROM" & _
                               " tblCourses "

    MsgBox ("After Monday=   ")

    Dim i As Integer
    For i = 0 To Me.cboMonday.ListCount - 1
        If i <> Me.cboMonday.Value - 1 Then
           Me.cboTuesday.AddItem (Me.cboMonday.ItemData(i))
        End If
    Next
    Me.cboTuesday = Me.cboTuesday.ItemData(0)

    For i = 0 To Me.cboMonday.ListCount - 1
        If i <> Me.cboMonday.Value - 1 Then
           Me.cboWednesday.AddItem (Me.cboMonday.ItemData(i))
        End If
    Next
    Me.cboWednesday = Me.cboWednesday.ItemData(1)

End Sub

Private Sub cboTuesday_AfterUpdate()
    Me.cboWednesday.RowSource = "SELECT CourseName FROM" & _
                               " tblCourses "


    Dim i As Integer

    MsgBox ("After Tuesday=   ")
    For i = 0 To Me.cboMonday.ListCount - 1
        If i <> Me.cboMonday.Value - 1 And i <> Me.cboTuesday.Value - 1 Then
           Me.cboWednesday.AddItem (Me.cboMonday.ItemData(i))
        End If
    Next
    Me.cboWednesday = Me.cboWednesday.ItemData(0)
End Sub

1 个答案:

答案 0 :(得分:0)

在表/查询组合框中添加/删除项目不是一个好的解决方案,当主表单在许多其他情况下刷新时,列表将刷新,包括更改行源属性,如您的示例中所示。

更好的方法是创建引用其他组合框的行源查询。例如,如果在cboWednesday中我不想包括在cboMonday和cboTuesday中选择的课程,则cboWednesday的Row Source属性将为SELECT CourseName FROM tblCourses WHERE CourseName Not In ([Forms]![Form1]![cboMonday],[Forms]![Form1]![cboTuesday]);。对于其他组合框,您可以根据需要添加任意数量的其他组合框。 在AfterUpdate组合框中,只需刷新组合框,这取决于当前组合框。

如果绑定和显示列相同,这应该有效,就像在您的示例中一样。如果隐藏了绑定列,则在重新查询后数据可能会消失。在这种情况下,您可以在所有组合框中保留完整的课程列表,但在BeforUpdate事件检查中是否已在其他组合框中选择了cource并拒绝选择并发出警告。