Привязка данных С# к выпадающему списку

Я не могу понять следующие 2 проблемы, учитывая этот код. Я сопоставил поле со списком с настраиваемым объектом, и я хочу, чтобы каждый раз, когда выбранное значение в поле со списком изменялось, настраиваемый объект также менялся.

public partial class MainForm : Form
{
    private Person _person;
    public MainForm()
    {
        InitializeComponent();
        _person = new Person();

        //Populating the combox, we have this.comboBoxCities.DataSource = this.cityBindingSource;
        cityBindingSource.Add(new City("London"));
        cityBindingSource.Add(new City("Paris"));
        _person.BirthCity = new City("Roma");
        cityBindingSource.Add(_person.BirthCity);
        cityBindingSource.Add(new City("Madrid"));

        //Doing the binding
        comboBoxCities.DataBindings.Add("SelectedItem", _person, "BirthCity");
    }

    private void buttonDisplay_Click(object sender, EventArgs e)
    {
        MessageBox.Show("BirthCity=" + _person.BirthCity.Name);
    }

    private int i = 0;
    private void buttonAddCity_Click(object sender, EventArgs e)
    {
        City city = new City("City n°" + i++);
        cityBindingSource.Add(city);
        comboBoxCities.SelectedItem = city;
    }

}

public class Person
{
    private City _birthCity;
    public City BirthCity
    {
        get { return _birthCity; }
        set
        {
            Console.WriteLine("Setting birthcity : " + value.Name);
            _birthCity = value;
        }
    }
}

public class City
{
    public string Name { get; set; }
    public City(string name) { Name = name; }
    public override string ToString() { return Name; }
}

1 - почему, когда я вручную выбираю два раза подряд (или более) разные значения в поле со списком, я получаю только один вызов BirthCity.Set с последним выбранным значением (и кажется, что вызов срабатывает только тогда, когда поле со списком теряет фокус)?

2 - почему, когда я нажимаю кнопку AddCity, а затем кнопку Display, отображаемый город не тот, который выбран (не тот, который отображается в поле со списком)


person Toto    schedule 25.08.2009    source источник
comment
Вы должны переопределить методы GetHashCode() и Equals().   -  person Rock    schedule 25.08.2009


Ответы (1)


why when I manually select twice in a row (or more) different value on the combobox, I got only one call to BirthCity.Set witht he last selected value (and the call seems firing only when the combobox lost the focus) ?

Вот как работает привязка данных: данные перемещаются из элемента управления в свойство при проверке, а проверка происходит, когда элемент управления теряет фокус.

why when I click buttonAddCity and then buttonDisplay, the diplayed city is not the one selected (not the one displayed in the comobox )

Я не знаю. Я создал простую форму (Visual C# Express 2008 с использованием .Net 3.5 SP1) и почти дословно вставил ваш код, и он работает, как и ожидалось: он показывает новый город в поле со списком.

Если вы добавите comboBoxCities.Focus(); до конца buttonAddCity_Click() вы убедитесь, что новый город будет помещен в _person.BirthCity раньше, чем в ValidateChildren().

person XXXXX    schedule 25.08.2009
comment
Спасибо, это было именно то, чего я не знал. У вас есть ссылка, объясняющая, как работает привязка данных? Другой вопрос: он отлично работает, если я добавляю comboboxCities.focus(), как было предложено, но он не работает с вызовом для проверки детей, почему? - person Toto; 25.08.2009
comment
‹blockquote›У вас есть ссылка, объясняющая, как работает привязка данных?‹/blockquote› К сожалению, нет. Я только сейчас изучаю С# с помощью Visual Studio Express, и документации довольно мало. Я читаю книгу «Связывание данных с Windows Forms 2.0» от Noyes, но в основном это связано с работой привязки данных с базами данных. - person XXXXX; 25.08.2009
comment
2: Если он отлично работает, когда вы добавляете SetFocus(), то вы, вероятно, имеете в виду в своем исходном вопросе, что новый город не помещается в свойство при его добавлении, а не отображается в поле со списком при его добавлении. Опять же, проблема заключается в том, что если вы не вызываете SetFocus(), поле со списком не может потерять фокус, вызывая проверку и затем привязку. - person XXXXX; 25.08.2009
comment
3: Вы должны иметь возможность вызывать ValidateChildren() для содержащего элемента управления (Форма, UserControl или еще что-то), который вызывает проверку и привязку для всех содержащихся элементов управления. Событие FormClose — одно из очевидных мест для его вызова, но есть и другие. - person XXXXX; 25.08.2009
comment
to 2 : действительно проблема заключалась в том, что новый город не был перемещен ----- to 3 : хорошо, я постараюсь найти хорошее место для вызова validatechildren(), так как вызов SetFocus не очень хорош, спасибо - person Toto; 25.08.2009