2016-07-04 11 views
0

Ich habe eine Combobox, die ihre Liste beim ersten Gebrauch erstellt. Ich weiß, dass die Art, wie ich "NotInList" benehmen möchte, nicht konventionell ist - ich möchte nicht verschwenden, den Gegenstand zu einem Tisch getrennt von dem benötigten Eintrag hinzuzufügen, aber ich möchte immer noch vor einem Gegenstand warnen, der nicht Es wurde noch nicht verwendet, so dass der Benutzer zweimal überlegen muss, bevor er den Eintrag akzeptiert.Warnung für dynamische Combobox-Liste

Sobald der Benutzer das Element hinzufügt, wird es automatisch in der Liste beim nächsten Mal angezeigt werden, da die Datenquelle für das Kombinationsfeld ist wie folgt:

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

Ich habe versucht, diese:

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 

Natürlich möchte Access, dass das Objekt tatsächlich existiert, bevor es den Fehler freigibt. Und wenn ich LimitToList auf "Nein" setze, erhält der Benutzer keine Warnung.

Wie kann ich dieses Verhalten erreichen?

Ok, habe ich versucht, diese, der gut arbeitet, wenn der Benutzer JA auswählt, sondern wird komplizierter, wenn der Benutzer „NEIN“

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 

wählt Wie lösche ich die Combobox, wenn der Benutzer auswählt NO? Wenn ich me.undo auswähle, werden alle Einträge rückgängig gemacht, aber ich möchte nur die Combobox löschen.

Übrigens ist die Form völlig ungebunden und keinen Eintrag akzeptieren, bis der Benutzer „Speichern“

Antwort

0

Erstens, ich bin nicht ganz sicher, was Sie erreichen wollen ...

Dann , erziehen Sie die Benutzer zum Drücken Escape zum Abbrechen. Dies ist ein Muss beim Ausführen einer Access-Anwendung.

Damit Ihr Code funktioniert, können Sie den Inhalt eines Steuerelements im BeforeUpdate Ereignis nicht ändern. So versuchen, die NachAktualisierung Ereignis mit entweder:

Me!cmbPROGRAM.Text = "" 

oder:

Me!cmbPROGRAM.Value = Null 
+0

Danke. Es ist meine ungebundene Form, die es zu einer Herausforderung macht. Ich hatte gehofft zu vermeiden, Lookup-Bibliotheken zu erstellen, aber ich denke, es ist endlich soweit – monty327