ComboBox mit DataSource.DefaultView.RowFilter

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    ComboBox mit DataSource.DefaultView.RowFilter

    Hallo allerseits

    Ich habe eine ComboBox 'CBGebaude' mit einer Tabelle einer SQL-Datenbank als DataSoure:

    VB.NET-Quellcode

    1. CBGebaude.DataSource = (New ZEVDataSetTableAdapters.T_GebäudeTableAdapter).GetData
    2. CBGebaude.DisplayMember = "GebäudeName"


    Ich habe für das Ereignis 'TextChanged' einen Filter eingebaut, der bei jeder Textänderung aktiv wird:

    VB.NET-Quellcode

    1. Dim enteredText As String = Trim(CBGebaude.Text)
    2. Debug.Print("Eingabe >" & enteredText & "<")
    3. If enteredText = "" Then
    4. '>>>Wenn der Text gelöscht wird sollen alle Einträge sichtbar sein
    5. CBGebaude.DataSource.DefaultView.RowFilter = CBGebaude.DataSource.Columns("GebäudeName").ColumnName & " like '%'"
    6. Else
    7. '>>> Wenn etwas eigegeben wird, werden die Einträge nach diesem String gefiltert
    8. CBGebaude.DataSource.DefaultView.RowFilter = CBGebaude.DataSource.Columns("GebäudeName").ColumnName & " like '%" & enteredText & "%'"
    9. End If
    10. '>>> bis hierher wunderbar, die DroppedDown-Liste enthält korrekt nur noch die gefilterten Einträge
    11. '>>>Da 'default' immer der oberste Eintrag der Liste im Textfeld erscheint, tausche ich diesen mit der Benutzereingabe aus.
    12. '>>> Dass dabei die Routine nochmals durchlaufen wird, stört den Ablauf nicht
    13. CBGebaude.Text = enteredText
    14. '>>> Cursor ans Ende, damit die Eingabe weitergeführt werden kann
    15. CBGebaude.SelectionStart = CBGebaude.Text.Length


    So verkürzt sich die Liste mit jeder Zeicheneingabe wie gewünscht.


    Das Problem:

    Wenn ich dann mit der Maus einen der Listeneinträge eindeutig anklicke, dann wird beim ERSTEN Versuch IMMER DER ERSTE EINTRAG aus der verbliebenen Liste aktiviert, nie das angeklickte Item.

    Erst wenn ich den Vorgang mit denselben Zeicheneingaben nochmals durchführe, dann wird korrekt der angeklickte Eintrag aktiviert - aber niemals beim ersten Mal.

    Gibt es hier eine Abhilfe?


    Ich wollte eigentlich die Eigenschaft ShouldPreserveUserEnteredPrefix der ComboBox auf True setzen, damit ich die Zeile CBGebaude.Text = enteredText nicht benötige, aber dieses Property ist für das Objekt ComboBox nicht verfügbar (...warum auch immer).


    Thanks for help.

    Code-Tags eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @BEU Willkommen im Forum. :thumbup:
    Kannst Du ggf. ein compilierendes Testprojekt einstellen, das den Effekt reproduziert?
    Projekt bereinigt zippen (ohne bin-, obj-, vs-Verzeichnisse),
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    (hmm - er wird wohl kaum eine Datenbank verzippen können... oder?)

    Vielleicht ist da eine Ereigniskette im Spiel - also dass der Mouseclick ein TextChanged auslöst, das refresht die DataSource, und damit ist die Klickposition flöten.
    Vielleicht Lösungs-Ansatz: Im MouseDown das TextChanged-Event de-abonnieren, und im MouseUp wieder re-abonnieren.
    ...korrekt - die DB kann ich natürlich nicht verzippen, und leider ist es so, dass eine DB benötigt wird.Ich hab es mit einer im Programm erstellten DataTable und auch mit einer Access-DB versucht, aber beide haben als ComboBox.Datasource keine RowFilter-Eigenschaft.

    Im Anhang nun das komplette Test-Projekt (ist ja nicht gross).
    Dazu muss man dann eine SQL-DB anlegen mit einer Tabelle, welche eine Spalte namens 'GebäudeName' enthält, diese entsprechend füllen, und dem Projekt als DataSource hinzufügen.

    Inzwischen musste ich noch feststellen, dass das beschriebene Phänomen doch nicht immer auftritt - bei manchen Buchstabeneingaben funktioniert es auch beim ersten Mal, wie es soll, aber ich konnte keinen Grund und keine Regel herausfinden.


    @ErfinderDesRades
    Soweit ich es ausprobiert habe, wirken die Ereignisse wie MouseDown, MouseClick etc. auf der ausgeklappten Liste nicht, sondern nur auf dem Hauptobjekt ComboBox - aber ich starte mal noch einige Versuche.
    Und natürlich löst der Mausklick das TextChanged aus - das ist ja der Sinn der Sache, dass der ausgewählte Text dann auch im Textfeld der ComboBox erscheint...

    Besten Dank erstmal
    Dateien

    BEU schrieb:

    aber beide haben als ComboBox.Datasource keine RowFilter-Eigenschaft.
    Arbeite mit BindingSource - die zieht man aus der Toolbox aufs Form.

    Habs jetzt gefixt, indem ich TextUpdate-Event verwende statt TextChanged.
    Und ganz viel GruselCode von dir aufgeräumt - also das kann jetzt eine Fundgrube für deinen Programmierstil sein.

    Das Wichtigste: Visual Studio – Empfohlene Einstellungen

    Dann ganz viel zum Lernen: Datenverarbeitungs-Vorraussetzungen

    (Dort ist gleich auf eine ganze Reihe von Tuts verlinkt)

    Mit dem Upload habich ja auch gezeigt, dass du keine Datenbank brauchst. Aber mehr dazu steht in den gegebenen Links
    Dateien
    ...da waren wir ja fast zeitgleich, ErfinderDesRades.

    Habe heute Abend auch noch ein wenig ausprobiert, und ein einfacher Wechsel vom TextChanged-Event auf das TextUpdated-Event hat die Lösung gebracht, so dass das Thema erledigt ist.

    Deine Antwort bestätigt es mir nochmal.

    Danke für die rasche Reaktion und eine gute Zeit.