2016-07-04 98 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