2016-07-04 104 views
0

我有一個組合框,它會在第一次使用時創建列表。我知道我希望「NotInList」的行爲方式不是傳統方式 - 我不想浪費將項目添加到與所需條目分開的表格中,但我仍想警告某件物品,還沒有被使用,所以用戶在接受輸入之前必須考慮三次。動態組合框列表的警告

一旦用戶添加的項目,它會自動在下一個時間,因爲組合框的數據源出現在列表如下:

SELECT tbl_SP.PROGRAM 
FROM tbl_SP 
GROUP BY tbl_SP.PROGRAM 
HAVING (((tbl_SP.PROGRAM) Is Not Null And (tbl_SP.PROGRAM)<>"")); 

我嘗試這樣做:

Private Sub cmbPROGRAM_NotInList(NewData As String, Response As Integer) 
    If MsgBox("'" & Chr(34) & NewData & Chr(34) & " hasn't been used yet. Add to list? ", vbQuestion + vbYesNo, "Add - " & NewData & "?") = vbYes Then 
     Response = acDataErrAdded 
    End If 

End Sub 

但是當然,Access在發佈錯誤之前希望項目實際存在。並且...如果我將LimitToList設置爲「否」,那麼用戶不會收到警告。

我該如何實現這種行爲?

好吧,我想這其中工作正常,如果用戶選擇了YES,但變得更加複雜,當用戶選擇「否」

Public Function ReturnsRecords(strSQL As String) As Boolean 
Dim d As DAO.Database 
Dim arr(1 To 3) As DAO.Recordset 
'Dim rs As DAO.Recordset 
    'assume 3 items in array above 
    Set d = CurrentDb 
    Set arr(1) = d.OpenRecordset(strSQL) 
    ' MsgBox "Record Count is " & arr(1).RecordCount 

    If arr(1).RecordCount > 0 Then 
     ReturnsRecords = True 
    Else 
     ReturnsRecords = False 
    End If 
    Set d = Nothing 


End Function 

Private Sub cmbPROGRAM_BeforeUpdate(Cancel As Integer) 
    Dim strSQL As String 

    strSQL = "Select * from LU_PROGRAM where PROGRAM ='" & Me.cmbPROGRAM & "'" 

    If ReturnsRecords(strSQL) = False Then 

     If MsgBox("'" & Chr(34) & Me.cmbPROGRAM & Chr(34) & " hasn't been used yet. Add to list? ", vbQuestion + vbYesNo, "Add - " & Me.cmbPROGRAM & "?") = vbNo Then 

      Cancel = True 
      ' how do I reset this? Me.cmbPROGRAM.Text = Null 
     End If 

    End If 
    End Sub 

如何清除組合框,如果用戶選擇NO?如果我選擇me.undo,則會撤消所有條目,但我只想清除組合框。

順便說一句,形式是完全綁定,直到用戶選擇「保存」

回答

0

首先,我不太清楚你想達到什麼不接受的項目...

然後,教育用戶按Escape取消。操作Access應用程序時,這是強制性的智慧。

爲了讓您的代碼正常工作,您無法更改BeforeUpdate事件中控件的內容。因此,嘗試了更新後事件有兩種:

Me!cmbPROGRAM.Text = "" 

或:

Me!cmbPROGRAM.Value = Null 
+0

謝謝。這是我的不受約束的形式,使它成爲一項挑戰。我希望避免創建查找庫,但我認爲它終於來了 – monty327