1
votes

Comment relier aux données le SelectedItem d'une zone de liste déroulante WinForms à une zone de texte

Code

J'ai cette interface utilisateur

Capture d'écran de l'interface utilisateur

avec ce code

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

namespace WinFormsComboBoxDatabinding
{
    public partial class Form1 : Form
    {
        public List<Person> PersonList { get; set; }
        public Person SelectedPerson { get; set; }

        public Form1()
        {
            InitializeComponent();
            InitializePersonList();
            InitializeDataBinding();
        }

        private void InitializePersonList()
        {
            PersonList = new List<Person>
            {
                new Person { FirstName = "Bob", LastName = "Builder" },
                new Person { FirstName = "Mary", LastName = "Poppins" }
            };
        }

        private void InitializeDataBinding()
        {
            SelectedPerson = PersonList[0];

            var bindingSource = new BindingSource();
            bindingSource.DataSource = PersonList;

            comboBox.DisplayMember = "FirstName";
            //comboBox.ValueMember = "LastName";
            comboBox.DataSource = bindingSource;

            textBoxFirstName.DataBindings.Add("Text", SelectedPerson, "FirstName");
            textBoxLastName.DataBindings.Add("Text", SelectedPerson, "LastName");
        }

        private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            SelectedPerson = comboBox.SelectedItem as Person;

            Debug.WriteLine($"SelectedPerson: {SelectedPerson}");
        }
    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public override string ToString()
        {
            return $"{FirstName} {LastName}";
        }
    }
}
  • J'ai vu que l'on peut définir la propriété Text des deux contrôles TextBox lorsque comboBox_SelectedIndexChanged est appelé, mais ce n'est pas vraiment une liaison de données, n'est-ce pas. Ce serait faire manuellement toute la logique de mise à jour.

Faites-moi savoir si j'ai besoin d'ajouter plus de détails à la question.


0 commentaires

3 Réponses :


0
votes

Vous n'avez pas besoin de la variable SelectedPerson. Il semble que vous ayez simplement câblé la mauvaise DataSource. Essayez-le de cette façon:

textBoxFirstName.DataBindings.Add("Text", bindingSource, "FirstName");
textBoxLastName.DataBindings.Add("Text", bindingSource, "LastName");


2 commentaires

En effet, cela a résolu le problème de la question 1 et la mise à jour du prénom dans la zone de texte met à jour la zone de liste déroulante. Merci! Des idées sur la question 2?


@Lernkurve Si vous modifiez la valeur du nom de la zone de texte, cela fonctionne (lorsque la zone de texte perd le focus, il met à jour la propriété). Le faire à partir de la ComboBox est un endroit un peu étrange pour le faire.



0
votes

Il vous suffit de définir ComboBox.DataSource sur l'objet List , représenté par la propriété PersonList ici.
Ajoutez un DataBinding aux contrôles qui doivent être mis à jour lorsque le ComboBox sélectionne un nouvel élément dans sa DataSource :

public List<Person> PersonList { get; set; }
public Person SelectedPerson { get; set; }

private void InitializePersonList()
{
    this.PersonList = new List<Person>
    {
        new Person { FirstName = "Bob", LastName = "Builder" },
        new Person { FirstName = "Mary", LastName = "Poppins" }
    };
}

private void InitializeDataBinding()
{
    comboBox.DisplayMember = "FirstName";
    comboBox.DataSource = this.PersonList;

    textBoxFirstName.DataBindings.Add("Text", PersonList, "FirstName");
    textBoxLastName.DataBindings.Add("Text", PersonList, "LastName");
}

private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    this.SelectedPerson = (Person)(sender as ComboBox).SelectedItem;
}

Les contrôles sont mis à jour automatiquement.
Dans le gestionnaire ComboBox SelectedIndexChanged , vous pouvez définir la valeur de la propriété SelectedPerson sur le SelectedItem actuel, en le convertissant en Person code > classe.

textBoxFirstName.DataBindings.Add("Text", PersonList, "FirstName");


0 commentaires

0
votes

Essayez ceci

private void InitializeDataBinding()
        {
            SelectedPerson = PersonList[0];

            var bindingSource = new BindingSource();
            bindingSource.DataSource = PersonList;

            comboBox.DisplayMember = "FirstName";
            comboBox.DataSource = bindingSource;

            textBoxFirstName.DataBindings.Add("Text", bindingSource, "FirstName");
            textBoxLastName.DataBindings.Add("Text", bindingSource, "LastName");
        }

private void comboBox_TextChanged(object sender, EventArgs e)
        {
            var selectedPerson = PersonList.FirstOrDefault(x => x.FirstName == comboBox.Text);
            if (selectedPerson == null) return;
            comboBox.SelectedItem = selectedPerson;
        }


0 commentaires