2017-11-29 4 views
0

Ich habe eine Combobox, die eine spezielle Anforderung hat. Es muss einen Gegenstand haben, der nur von dem Programm ausgewählt werden kann (basierend auf bestimmten erkannten Kriterien) und nicht vom Benutzer selbst ausgewählt werden kann. Gibt es eine Möglichkeit, dies in VBA Access zu tun?Kombinationsfeld mit Option, die nur programmatisch und nicht vom Benutzer in VBA ausgewählt werden kann Zugriff

Ich fand this solution aber es ist eine Art Workaround, die ich tun werde, wenn es keine bessere Alternative gibt. Was ich will, ist für die Option, nicht einmal sichtbar zu sein.

+1

Warum sogar eine Combobox erstellen, wenn der Benutzer nicht darauf zugreifen oder den Wert ändern darf. Verwenden Sie einfach eine TextBox und zeigen Sie den gewünschten Wert an? – Barns

+0

Nun gibt es eine Vielzahl von Optionen, die der Benutzer auswählen kann. Es gibt nur diese eine, die das Programm nicht erkennen muss. Wenn diese Option festgelegt werden würde, wird sie gesperrt und kann nur programmatisch deaktiviert werden. –

+0

Ich nehme an, ich könnte den Artikel hinzufügen, sofort auswählen und dann sperren. Wenn es nicht gesetzt werden soll, kann ich es entsperren, den Wert auf den Standardwert setzen und das Element aus der Combobox entfernen. –

Antwort

1

Sie sollten versuchen, Geschäftslogik aus Ihren Formularen zu entfernen. Sie benötigen zwei Funktionen für diese Aufgabe.

Function SelectAndLock(ByRef SelectPicker As ComboBox, Id As Long) 

    Dim SQL_GET As String 
    SQL_GET = "SELECT ID, Text From ComboBoxValues WHERE [ID] = " & Id 

    SelectPicker.RowSourceType = "Table/Query" 
    SelectPicker.RowSource = SQL_GET 
    SelectPicker.Value = Id 
    SelectPicker.enabled = False 

End Function 

Function PopulateSelectPicker(ByRef SelectPicker As ComboBox) 

    Dim SQL_GET As String 
    SQL_GET = "SELECT ID, Text From ComboBoxValues WHERE [ID] not in (your system ids);" 

    SelectPicker.RowSourceType = "Table/Query" 
    SelectPicker.RowSource = SQL_GET 
    SelectPicker.Value = "" ' or null if your field is nullable 
    SelectPicker.enabled = True 

End Function 

Nun, wenn Ihr Modell des "System" Zustand deDECTed hat, würden Sie

call SelectAndLock(SelectPicker,id) 

nennen, welche die ID wählen würden, die das System wählt und sperrt die Combobox.

jede andere Bedingung oder standardmäßig, rufen Sie einfach

call PopulateSelectPicker(SelectPicker) 

, die alle Optionen außer dem System Benutzer-IDs sollten nicht sehen Liste würde.

Dies ist nur ein Konzept. Passen Sie es so an, wie Sie es benötigen.

0

Diese Situation scheint sehr seltsam, und ich würde es nie in meiner app will ... aber für den Moment zu akzeptieren, dass der gewünschte Ansatz richtig und gut ist, und eine Lösung benötigt wird ...

Sie können Binde an das Datenquellentabellenfeld an (da du in MS Access bist, vermute ich gebundene Formulare, obwohl das nicht garantiert ist) über ein verstecktes Steuerelement (Textfeld, nehme ich an), das wir txtYouNoSeeMe nennen werden.

Beziehen wir uns auf den Wert, den das System als NoPickMe auswählen soll (aber nicht den Benutzer).

Jetzt müssen Sie Ihrem Benutzer die Möglichkeit geben, "die meisten Optionen" auszuwählen - richten Sie die Combobox (cboYesYouSeeMe) nach Bedarf ein und lassen Sie sie ungebunden. NoPickMe ist keine Option in dieser Liste.

Schließlich werden Sie leider einige Logik in die Behandlung von AfterUpdate-Ereignissen für cboYesYouSeeMe einbinden müssen. Wenn Sie zulassen möchten, dass der Benutzer eine Option in cboYesYouSeeMe auswählt, müssen Sie den ausgewählten Wert an Ihr HIDDEN-gebundenes Steuerelement txtYouNoSeeMe übertragen. Tun Sie das im AfterUpdate-Ereignis.

Wenn Sie möchten, dass das System den "versteckten" Wert NoPickMe (den der Benutzer nicht sehen sollte) auswählt, so sei es ... legen Sie diesen Wert in das versteckte txtYouNoSeeMe. Ich habe keine Ahnung, was Sie (in solchen Fällen) in cboYesYouSeeMe anzeigen möchten.

Wenn der Datensatz gespeichert wird, wird der gespeicherte Wert von txtYouNoSeeMe in der Datenbank gespeichert. Wenn keine Datenbank beteiligt ist, ignorieren Sie einfach meine Verweise auf die Datenbindung.

Diese Lösung funktioniert, obwohl ich vergessen habe, ein oder zwei Details zu erklären. Hoffentlich kommst du auf die Idee.

1

Sie könnten dem Kombinationsfeld ein Ereignis "bei Änderung" hinzufügen. Nehmen wir an, die Option, die nur programmgesteuert ausgewählt werden kann, ist "Programm nur Element". Ich habe auch angenommen, dass Sie ein vorheriges Feld in der Form haben, auf die wir den Fokus zurück verschieben können. Sie haben nicht erwähnt, was die Kriterien für diese Option sind, deshalb gehe ich davon aus, dass das vorherige Feld 1 und nicht 0 sein muss (Sie müssen die if ... then-Klausel entsprechend Ihren Kriterien ändern).

private sub cbo_list_change() 

if me.cbo_list.value "Program only item" then 
    if me.chk_previous.value = 0 then 
    msgbox "This item cannot be selected. Please select an alternative item", vbOKOnly 
    me.cbo_list.value ="" 
    chk_previous.setFocus 
    end if 
end if 

End sub 

können Sie me.cbo_list.value="program only option" in einem anderen Ereignis verwenden, wenn die Kriterien erfüllt sind.

Verwandte Themen