Как привязать выбранный элемент комбинированного списка WinForms к TextBox - PullRequest
0 голосов
/ 09 января 2019

Код

У меня есть этот пользовательский интерфейс

Screenshot of UI

с этим кодом

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}";
        }
    }
}

Вопросы

У меня есть два вопроса о привязке данных:

  1. Когда я выбираю Мэри в ComboBox, два элемента управления TextBox не обновляются. Это почему? Что я сделал не так?

    Screenshot of UI

    Screenshot of Debug output

  2. Когда я изменяю текст «Мэри» в ComboBox, объект SelectedPerson не обновляется с новым FirstName, скажем «Мэри изменилась», из ComboBox. Как бы мне добиться такого поведения при изменении имени ComboBox FirstName для обновления FirstName SelectedPerson? Или это невозможно с ComboBox?

    UI of Mary changed

    Debug output of Mary changed

Другой эксперимент

  • Я видел, что можно задать свойство Text для двух элементов управления TextBox, когда вызывается comboBox_SelectedIndexChanged, но на самом деле это не привязка данных. Это будет делать всю логику обновления вручную.

Дайте мне знать, если мне нужно добавить больше деталей к вопросу.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вам просто нужно установить ComboBox.DataSource для объекта List<Person>, представленного здесь свойством PersonList.
Добавьте DataBinding к элементам управления, которые необходимо обновить, когда ComboBox выбирает новый элемент из его DataSource:

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

Элементы управления обновляются автоматически.
В обработчике ComboBox SelectedIndexChanged вы можете установить значение свойства SelectedPerson для текущего SelectedItem, приведя его к классу Person.

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;
}
0 голосов
/ 09 января 2019

Попробуйте это

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 голосов
/ 09 января 2019

Вам не нужна переменная SelectedPerson. Похоже, вы просто подключили неверный источник данных. Попробуйте это так:

textBoxFirstName.DataBindings.Add("Text", bindingSource, "FirstName");
textBoxLastName.DataBindings.Add("Text", bindingSource, "LastName");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...