ComboBox gibt kein ValueMember zurück

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

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

    ComboBox gibt kein ValueMember zurück

    Hallo zusammen,

    ich möchte bei einer ComboBox beim Ereignis "Handles ComboBox.TextChanged" das ValueMember abfragen. Der Wert wird aber nicht zurückgeliefert sondern nichts.

    Wenn ich das Displaymember abfrage bekomme ich ein Ergebnis.

    Dasselbe passiert auch bei den Ereignissen DisplayMemberChanged oder ValueMemberChanged.

    Gibt es evtl. noch andere Ereignisse, die ich nehmen sollte?

    Die das Display- und ValueMember der ComboBox ist über eine BindingSource verbunden. In der Form zeigt es den Wert des DisplayMembers korret an.

    Grüße
    Frank

    MichaHo schrieb:

    Erkläre doch mal was Du vor hast, vielleicht gibt es ja einen anderen Weg


    Ich habe mehrere Textfelder mit denen ich Daten in meiner DaraGridView filtern möchte. Da ich dort allerdings auch ComboBox-Werte gabe, die ich auch filtern möchte, habe ich für diese auch ComboBoxfelder zum filtern erstellt.
    Ich möchte quasie das Display-Member in der FilterComboBox auswählen können und das Value-Member dann als Filterkriterium übergeben.

    ErfinderDesRades schrieb:

    frankseipferd schrieb:

    ist über eine BindingSource verbunden
    dann lass die Combo in Frieden, und hol den Datensatz aus der BindingSource.
    Gibts ein Problem damit?
    Weil meistens gibts ein Problem, wenn entscheidende Hinweise von mir total ignoriert werden.
    Mit Ignorieren löst man aber keine Probleme.

    ErfinderDesRades schrieb:

    dann lass die Combo in Frieden, und hol den Datensatz aus der BindingSource.

    Gibts ein Problem damit?
    Weil meistens gibts ein Problem, wenn entscheidende Hinweise von mir total ignoriert werden.
    Mit Ignorieren löst man aber keine Probleme.


    Ich versteh nicht genau was Du damit meinst...
    Was meinst Du mit Datensatz aus der BindingSource genau?

    Mein Filter sieht so aus:

    VB.NET-Quellcode

    1. If cboEingangsartIDFilter.ValueMember <> "" Then TblUmsaetzePNBindingSource.Filter = "EingangsartID = " & cboEingangsartIDFilter.ValueMember


    Ich filtere quasi auf die BindingSource, brauche dafür aber das ValueMember der ComboBox. Oder gibt es noch andere Möglichkeiten wie ComboBoxen, mit Display- und ValueMember?

    frankseipferd schrieb:

    Oder gibt es noch andere Möglichkeiten wie ComboBoxen, mit Display- und ValueMember?
    Genau.
    Mit ComboBoxen, mit Display- und ValueMember hat das überhaupt nichts zu tun.
    Guggemol Datensätze aus der BindingSource holen, Zeile #16 - die aktuell gewählte typisierte Row wird mit einem zugegebenermassen komischen doppelten Cast von BS.Current abgerufen - nix mit Combobox oder sonstwas - auch nix mit DGV, falls du iwann mal auf die Idee kommen solltest ;)

    BindingSource.Current heißt BindingSource.Current, weils halt der current Datensatz ist.

    ErfinderDesRades schrieb:

    Guggemol Datensätze aus der BindingSource holen


    Das könnte ich zwar auch so machen wie Du es vorschlägst, allerdings weis ich dann immer noch nocht, welche Wert ich mit dem Search-Feld übergeben soll... Für die Suche in der BindingSource muss es der Index-Wert der Eingangsart sein, was eine nicht aussagekräftige integer-Zahl ist.
    Der Benutzer kann damit aber bei der Eingabe nicht wirklich was anfangen, sondern er muss den Namen der Eingangsart als Suchtext eingeben können. Somit habe ich zwei unterschiedliche Werte. Einmal den Namen, mit dem der Benutzer sucht und in der BindingSource dann den Index-Wert dazu.
    Wie komme ich vom Namen den der Benutzer eingibt zum zugehörigen Index, mit dem ich dann in der BindingSource suchen kann? EinComboFeld ist doch genau dazu da oder nicht?

    willst Du die Einträge in der ComboBox filtern? oder wo soll das gefilterte Ergebnis hin?

    ansonsten würde sowas funktionieren (analog zu @ErfinderDesRades Hinweis)

    VB.NET-Quellcode

    1. BindingsourceName.Filter = "Spaltenname = " & ComboBoxName.SelectedItem
    "Hier könnte Ihre Werbung stehen..."
    Ich will einen Eintrag in der ComboBox auswählen können und mit dem Ergebnis (und zwar dem zugehörigen ValueMember der Combobox, NICHT dem DisplayMember) die übereinstimmenden Datensätze in einer DataGridView bzw. in der zugeordneten DataBinding anzeigen lassen.

    Der Befehl BindingsourceName.Filter = "Spaltenname = " & ComboBoxName.SelectedItem bringt folgenden Fehler:

    Zusätzliche Informationen: Fehler beim Auflösen der Überladung. Kein Public = kann mit diesen Argumenten aufgerufen werden:
    'Public Shared Operator =(a As String, b As String) As Boolean':
    Der mit dem Argument übereinstimmende Parameter a kann nicht von DataRowView in String konvertieren..

    Im Prinzip möchte beim Auswählen eines Textes aus der ComboBox das ValueMember zurückgeliefert bekommen. Das ist aber immer leer :(

    frankseipferd schrieb:

    ja und das über die BindingSource als Datenquelle exisiterende ValueMember sollte zurückgeliefert werden, damit man damit die Daten dann aus der BindingSource holen oder filtern kann oder? :)
    WasWasWasWasWas????
    Ich wiederhole einfach nochmal, wie die Dinge liegen:
    Hol den in der Combo angewählten Datensatz aus der BindingSource. Tut dazu habich dir gegeben.
    Verwende diesen Datensatz - eine typisierte Datarow, um für die andere BindingSource einen Filter zu erstellen. Das wird so auch im gegebenen Tut gemacht.

    Mehr kann ich dir nicht erklären, ich kenne nicht den genauen Datentyp der typisierten DataRow, und weiß auch nicht, welche ihrer Properties du zum Filtern verwenden willst.

    Auf jeden fall keinen "über die BindingSource als Datenquelle existierenden Valuemember" (was immer das sein mag) ;)
    Nur damit ich mich auch vertsanden fühle: :)
    Die ComboBox hat eine Eigenschaft ValueMember. Dieses ist der Wert, den man als Bindeglied zu weiteren Zwecken weitergibt. I.d.R. der Index um einen Datensatz o.ä. in einer weiteren Anwendung zu suchen etc.

    Ich habe jetzt glaub verstanden, dass Du die BindingSource der ComboBox meinst, die ich auslesen soll... War mir deshalb nicht bewusst, weil ich immer daran hing, die ValueMember auszulesen.
    Hast Du mir nochmal das Tut dafür bevor ich meine ganzen Themen durchforsten muss ;)
    nicht alle deine Themen - nur diesen Thread:

    ErfinderDesRades schrieb:

    frankseipferd schrieb:

    Oder gibt es noch andere Möglichkeiten wie ComboBoxen, mit Display- und ValueMember?
    Genau.
    Mit ComboBoxen, mit Display- und ValueMember hat das überhaupt nichts zu tun.
    Guggemol Datensätze aus der BindingSource holen, Zeile #16 - die aktuell gewählte typisierte Row wird mit einem zugegebenermassen komischen doppelten Cast von BS.Current abgerufen - nix mit Combobox oder sonstwas - auch nix mit DGV, falls du iwann mal auf die Idee kommen solltest ;)

    BindingSource.Current heißt BindingSource.Current, weils halt der current Datensatz ist.


    Zum Verstanden Fühlen - das geht deshalb nicht, weils inhaltlich falsch ist.
    Die ComboBox hat eine Eigenschaft ValueMember.
    richtig
    Dieses ist der Wert, den man als Bindeglied zu weiteren Zwecken weitergibt.
    falsch.
    ValueMember gibt man nicht weiter.
    Weisst du überhaupt, welchen Datentyp Combobox.ValueMember hat? Guck mal im OB nach und poste hier, was du rausfundest.
    I.d.R. der Index um einen Datensatz o.ä. in einer weiteren Anwendung zu suchen etc.
    Aua!
    Was ist denn der "Index um einen Datensatz o.ä."?
    Und in welcher anderen Anwendung willst du denn iwas suchen???

    Ich kann mir allenfalls zusammenreimen, dass du die Combobox.Value-Property meinst (welchen Datentyp hat die übrigens?)
    Die kann man u.U. hernehmen, um in iwelchen Tabellen nach einem Datensatz zu suchen. Man wär aber schön blöd, wenn man so umständlich vorginge.
    Wie gesagt (und nicht zum ersten mal): Lass die Combo in Frieden, und hol stattdessen den Datensatz aus der BindingSource.
    Dann hast du den ganzen Datensatz, typisiert, mit allen seinen Properties.
    Bei Combobox.Value kriegst du nur einen popligen, untypisierten Wert.

    ErfinderDesRades schrieb:

    Weisst du überhaupt, welchen Datentyp Combobox.ValueMember hat? Guck mal im OB nach und poste hier, was du rausfundest.


    Was meinst Du mit OB?


    ErfinderDesRades schrieb:

    Was ist denn der "Index um einen Datensatz o.ä."?
    Und in welcher anderen Anwendung willst du denn iwas suchen???


    Mit Index meine ich das Suchkriterium um Daten in einer Tabelle zu finden. Bsp. eine Kundennummer, worüber man die zugehörigen Adressdaten etc. identifizieren und dann in einer DataGridView anzeigen lassen kann.


    ErfinderDesRades schrieb:

    Ich kann mir allenfalls zusammenreimen, dass du die Combobox.Value-Property meinst (welchen Datentyp hat die übrigens?)
    Die kann man u.U. hernehmen, um in iwelchen Tabellen nach einem Datensatz zu suchen. Man wär aber schön blöd, wenn man so umständlich vorginge.


    Ich komme aus der Access VBA welt und dort gibt es analog zur Combobox ein Kombinationsfeld mit der Eigenschaft "Gebundene Spalte". Dieser Wert wird beim Auswählen eines Textes in dem Kombifeld zurückgeliefert und man kann damit Daten o.ä. entsprechend suchen oder filtern. Vermutlich meine ich - wie Du auch erwähnt hattest - die Combobox.Value-Proberty und verwechsle hier noch so manches :S
    OB ist der ObjectBrowser. Guggemol hier: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Der OB informiert dich vollständig über alle Datentypen, die in deiner Solution vewendet werden oder auch nur verfügbar sind.
    Damit kannst du auch den Datentyp der Combobox.ValueMember - Property herausfinden. Und den von .Value.

    Aber .Value bitte nicht benutzen - wie gesagt:

    ErfinderDesRades schrieb:

    Hol den in der Combo angewählten Datensatz aus der BindingSource. Tut dazu habich dir gegeben.
    Verwende diesen Datensatz - eine typisierte Datarow, um für die andere BindingSource einen Filter zu erstellen. Das wird so auch im gegebenen Tut gemacht.

    Und auch das Tut geb ich dir noch einmal: Datensätze aus der BindingSource holen