none
TextBox.Text an ComboBox.SelectedValue binden RRS feed

  • Frage

  • Hallo,

    ich habe eine Eingabemaske wo ein Berater über eine Combobox ausgewählt werden kann. Für Tastaturfans möchte ich aber auch die Möglichkeit schaffen, die Beraternummer in einer Textbox einzugeben. Gibt es eine elegante Lösung die beiden Controls zu verknüpfen? Ich möchte, dass, wenn in der Combobox ein Name ausgewählt wird, die Mitarbeiternummer in der Textbox angezeigt wird und umgekehrt.

    var ber = context.Beraters .Where(b => b.AbteilungID == _login.Abteilungsnummer) .OrderBy(b => b.Name) .ToList();

    beraterComboBox.ValueMember = "Beraternummer"; beraterComboBox.DisplayMember = "Name"; beraterComboBox.DataSource = ber;

    Das heißt, der Wert der in der Textbox eingegeben wird entspricht dem Wert Combox.SelectedValue.

    Wie ich es 'manuell' löse weiß ich, ich hätte aber gern dass sich die Felder automatisch anpassen. Beraternummer ist ein Alpha Wert, d.h die Beraternummer ist ebenfalls

    Ist das überhaupt möglich, wenn ja wie muß ich vorgehen?

    Grüße

    Siegfried

    Dienstag, 22. April 2014 22:01

Antworten

  • Hallo,
    ich vermute mal, das du mit WinForms arbeitest - nicht mit WPF wie ich es gestern dachte.

    Es ist möglich die TextBox an die ComboBox zu binden:

    textBox1.DataBindings.Add(new Binding("Text", beraterComboBox, "SelectedValue", true, DataSourceUpdateMode.Never));

    Anders herum funktioniert das aber leider nicht. Dort musst du manuell vorgehen:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        int nummer;
        if (int.TryParse(textBox1.Text, out nummer))
            beraterComboBox.SelectedItem = (beraterComboBox.DataSource as Item[]).FirstOrDefault(x => x.Beraternummer == nummer);//Je nach dem was du genau vor hast, kannst du den Code noch anpassen. So dass bei 12 das erste Element auch 123 sein könnte, wenn es kein 12 gibt.
        else
            beraterComboBox.SelectedItem = null;

    Sobald ein falscher Wert eingegeben wird, wird die ComboBox zurück gesetzt. Die ComboBox aktuelisiert sich bei jeder Änderung der Eingabe.

    Am Ende ist es aber auch nicht viel Eleganter als alles im Code zu aktualisieren.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 23. April 2014 12:25
    Moderator

Alle Antworten

  • Hallo,
    warum benutzt du keine editierbare ComboBox?

    <ComboBox Name="beraterComboBox" IsEditable="True" ...

    Dann könntest du eine ValidationRule erzeugen um zu überprüfen ob der eingegebene Wert auch wirklich in der gebundenen Liste stehen. Wie das geht erfährst du unter Gewusst wie: Implementieren der Bindungsvalidierung

    Der Regel kannst du im XAML einen Namen geben und so im Codebehind die Liste zuweisen. Eine Datenbindung ist leider nicht möglich.

    Mit meinem Vorschlag kann der "Tastaturfan" (worunter ich auch zähle) den Namen einfach eingeben. Wenn du IsEditable auf false setzt, kann man lediglich das erste Zeichen drücken. Alle weiteren Elemente mit dem selben Anfangsbuchstaben müssten mit den Pfeiltasten durchsucht werden.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 22. April 2014 22:30
    Moderator
  • Hallo Tom,

    Das Problem ist, das die Tastatureingaben über einen numerischen Schlüssel erfolgen soll.  Und die Beratereingabe ist nicht die einzige, wo Maus- und Tastatureingabe möglich sein sollen. Jeweils mit Bezeichnung oder numerischem Schlüssel, da die Maske auch zur Nacherfassung (wo die Daten während der Beratung auf ein Formular geschrieben und nachträglich erfasst werden). Die ganze Maske soll nur über die numerische Tastatur eingegeben werden können. Tab Order wird auf diese Bedürfnisse ausgelegt. Ich denke ich werde die Textbox bzw. Combobox manuell updaten, wenn sich wenn sich jeweils das andere ändert.

    Ich warte mit dem Schließen des Threads noch bis morgen, vielleicht hat noch irgendwer eine andere Idee dazu.

    Vielen Dank für Deine Ausführungen

    Siegfried

    Mittwoch, 23. April 2014 04:32
  • Hallo,
    ich vermute mal, das du mit WinForms arbeitest - nicht mit WPF wie ich es gestern dachte.

    Es ist möglich die TextBox an die ComboBox zu binden:

    textBox1.DataBindings.Add(new Binding("Text", beraterComboBox, "SelectedValue", true, DataSourceUpdateMode.Never));

    Anders herum funktioniert das aber leider nicht. Dort musst du manuell vorgehen:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        int nummer;
        if (int.TryParse(textBox1.Text, out nummer))
            beraterComboBox.SelectedItem = (beraterComboBox.DataSource as Item[]).FirstOrDefault(x => x.Beraternummer == nummer);//Je nach dem was du genau vor hast, kannst du den Code noch anpassen. So dass bei 12 das erste Element auch 123 sein könnte, wenn es kein 12 gibt.
        else
            beraterComboBox.SelectedItem = null;

    Sobald ein falscher Wert eingegeben wird, wird die ComboBox zurück gesetzt. Die ComboBox aktuelisiert sich bei jeder Änderung der Eingabe.

    Am Ende ist es aber auch nicht viel Eleganter als alles im Code zu aktualisieren.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 23. April 2014 12:25
    Moderator
  • Hallo,

    ja, Du hast recht, es ist ein WinForms Projekt. Ich glaube ich werde alles im Code aktualisieren.  Wäre zu schön gewesen wenn das Binding in beide Richtungen funktioniert hätte.

    Vielen Dank für Deine Bemühungen

    Siegfried

    Mittwoch, 23. April 2014 20:39