鉴于此代码,我无法理解以下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 - 为什么当我点击buttonAddCity然后再按buttonDisplay时,显示的城市不是所选择的城市(不是在组合框中显示的城市)
答案 0 :(得分:2)
为什么当我在组合框中手动选择连续两次(或更多)不同的值时,我只得到一次对BirthCity.Set的调用,而不是最后选择的值(并且只有当组合框失去焦点时调用似乎才会触发) ?
这就是数据绑定的工作方式,在验证发生时数据从控件移动到属性,并在控件失去焦点时进行验证。
为什么当我点击buttonAddCity然后再按buttonDisplay时,显示的城市不是所选择的城市(不是在组合框中显示的那个)
我不知道。我创建了一个简单的表单(使用.Net 3.5 SP1的Visual C#Express 2008)并且几乎逐字地粘贴了您的代码,它按预期工作:它在组合框中显示新城市。
如果你添加comboBoxCities.Focus();在buttonAddCity_Click()的末尾,你将确保新城市被推入_person.BirthCity,而不是在ValidateChildren()上。