2015-12-01 74 views
0

我正在創建課程計劃的項目。我正在使用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 

回答

0

添加/表/查詢組合框刪除項目是不是很好的解決方案,當主窗體在許多其他情況下刷新的,包括在你的榜樣行來源屬性的變化,如列表將被刷新。

更好的方法是創建帶有對其他組合框的引用的行源查詢。例如,如果在cboWednesday中,我不想包含在cboMonday和cboTuesday中選擇的課程,則cboWednesday的Row Source屬性將爲SELECT CourseName FROM tblCourses WHERE CourseName Not In ([Forms]![Form1]![cboMonday],[Forms]![Form1]![cboTuesday]);。對於其他組合框,您可以根據需要爲其他組合框添加儘可能多的引用。 在AfterUpdate組合框事件中,只刷新取決於當前組合框的組合框。

這應該工作,如果綁定和顯示列是相同的,就像你的例子。如果綁定列被隱藏,則重新查詢後數據可能會消失。在這種情況下,您可以在所有組合框中留下完整課程列表,但在BeforUpdate事件中,請檢查是否已在其他組合框中選擇了cource並拒絕具有警告的選擇。

+0

我該如何拒絕帶有警告的選擇。 – Skofiar

+0

'BeforeUpdate'事件的參數爲'Cancel'。如果將其設置爲「True」,則不會接受選定的值。檢查是否選擇了錯誤的值,彈出消息,設置'Cancel = true'並退出sub –