Tabelle "einsparen", Combobox mit eigener Datasource klappt nicht zu 100% - Wert wird beim editieren nicht geladen

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

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

    Tabelle "einsparen", Combobox mit eigener Datasource klappt nicht zu 100% - Wert wird beim editieren nicht geladen

    Hallo zusammen.

    Ich dachte mir, ich spare mir die ein oder andere Tabelle in meinem Programm mit Werten, die
    sowieso mehr oder weniger fix sind.
    Beispiel: Anrede, Bundesländer

    Das hatte ich vorher in eigenen Tabellen und hab das jetzt in eine Settings-Tabelle verschoben.
    In der Settings-Tabelle sind die Daten in einem String-Feld gespeichert.
    z.B. für Anrede: "<keine Angabe>°Frau°Herr"

    Nun möchte ich die Werte beim Erstellen oder Editieren eines Datensatzes auswählen, was grundsätzlich auch super funktioniert:

    VB.NET-Quellcode

    1. combobox.DataSource = rwAppSetting.strSetting.Split("°"c).ToArray


    Bei den Databindings ist dann eingestellt, dass der Text genutzt werden soll bsMitarbeiterDetail - Anrede
    Wenn ich in der combobox was auswähle, wird das auch ordentlich gespeichert. Wenn ich einen Datensatz editiere, wird
    jedoch immer "<keine Angabe>" - also der erste Eintrag ausgewählt, obwohl der Datensatz z.B. "Frau" beinhaltet. Das war bei den Tabellen anders.
    Gibt's hier einen Weg, das mit meiner DataSource auch wieder der korrekte Wert geladen wird? DataBinding auf SelectedValue umstellen, wie
    es bei normalen BindingSources der Fall ist hab ich schon probiert, hilft leider nicht.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Kannst Du ein kleines Beispielprojekt hochladen, bevor wir das hier (ggf. falsch) nachbauen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Anbei ein Mini-Projekt - stört euch nicht an dem Namen, das war mal für was Anderes gedacht ;)
    Die erforderlichen Daten sollten automatisch zum Start erzeugt werden.

    Dann auf Personen -> eine neue anlegen. Anreden gibt's einmal aus der DataTable über BIndingSource und einmal aus einem String-Array.
    Wenn die Person erstellt wurde, dann mit erneutem Doppelklick auf die Person um diese zu editieren. Die Anrede (wenn man nicht <keine Angabe> gewählt hat) ist
    vom String-Array dann im Edit-Dialog <keine Angabe>, in der cmb der DataTable wird der korrekte Wert angezeigt.

    Dateien
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    <p>

    tragl schrieb:

    Wenn ich in der combobox was ausw&auml;hle, wird das auch ordentlich gespeichert. Wenn ich einen Datensatz editiere, wird<br />
    jedoch immer &quot;&lt;keine Angabe&gt;&quot; - also der erste Eintrag ausgew&auml;hlt, obwohl der Datensatz z.B. &quot;Frau&quot; beinhaltet. Das war bei den Tabellen anders.
    normalerweise muss man die Combo halt richtig einrichten.</p>

    <p>An Text darf kein Databinding,</p>

    <p>ValueMember muss man richtig setzen, und glaub SelectedValue an die richtige Spalte der richtigen BindingSource binden</p>

    <p>jibbets tut zu im tut-bereich.</p>

    <p>Deine kleine Solution hat zig libraries eingebunden, die ich nicht installiert habe.</p>
    Was wohl umständlich ist, aber funktioniert:

    Mein String-Array in ein KeyValuePair(Of String, String) verpacken,
    das wiederum an eine Bindingsource heften. Damit klappts.

    Also sowas wie:

    VB.NET-Quellcode

    1. Dim bsKvp as New BindingSource
    2. bsKvp.DataSource = rwAppSetting.Split("°"c).Select(Function(str) New KeyValuePair(Of String,String)(str,str)).ToList
    3. cmbAnrede.DataSource = bsKvp
    4. cmbAnrede.DisplayMember = "Value"
    5. cmbAnrede.ValueMember = "Key"

    + Dann noch die SelectedValue an die richtige Spalte der Haupt-Bindingsource.

    Ich mach das über den Designer:
    - BindingSource anlegen
    - In Designer.vb die DataSource ändern auf GetType(System.Collections.Generic.KeyValuePair(Of String, String))
    - Danach im Designer alles zuordnen
    - Codeseitig die richtige List(Of KeyValuepair) dranheften


    Bei mir musste ich jetzt noch drauf achten, dass die DataSource der Bindingsource schon im Sub New() gemacht wird, erst dann klappt alles wie es soll
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    achja, stimmt: Databinding braucht immer Objekte, also Klassen mit Properties. Einfache Strings sind einfach Strings, und haben keine Property.
    Ein noch einfachereres Objekt als KeyValuePair(Of String,String) ist übrigens Tuple(Of String).

    Jo, und die Vorgehensweise ist umständlich. Es gibt noch eine andere - bei der kann man dem Projekt eine DataSource zufügen - dafür gibts einen Assistenten, und dann kann man im FormDesigner diese Object-Datasource auch für die BS anwählen.
    Kommt im Form.Designer-Code dieselbe Codezeile bei raus.
    Ich find das Geklickse mit dem Assistenten aber noch umständlicher

    ErfinderDesRades schrieb:

    bei der kann man dem Projekt eine DataSource zufügen

    Das hab ich gemacht, finde aber System.Collections.Generic.KeyValuePair(Of String, String) da nicht. Hab da was anderes drin aktuell, das tausch' ich dann in der Designer.vb einfach aus. Das geklickse macht mir nix aus, bin ab und an
    ja sowieso im Designer unterwegs und die beschriebene Vorgehensweise hält sich in meinem Projekt in Grenzen.

    Wiederfinden kann ich das Ganze auch recht schnell, weil ich die Bindingsources mit "bsKvp..." benamt hab ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: