2009-08-25 17 views
1

このコードでは、次の2つの問題を理解できません。私はカスタムオブジェクトにコンボボックスをマップし、コンボボックスで選択した値が変わるたびにカスタムオブジェクトも変わります。コンボボックスでのC#データバインド

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 - 私は手動でコンボボックスの上に別の値を2回連続で選択します(またはそれ以上)のとき、私は彼witht BirthCity.Setに最後に選択した値を一つだけ電話を受けた(と呼び出しがときにのみ発火ようだ理由コンボボックスがフォーカスを失った?)

2 - 私は、buttonAddCityとbuttonDisplayをクリックすると、diplayed都市が選択された一つ(不comoboxに表示された1つ)

+0

GetHashCode()メソッドとEquals()メソッドをオーバーライドする必要があります。 – Rock

答えて

2
ない理由なぜ手動で(またはそれ以上)の異なる行に二回選択した場合私はBirthCity.Setへのコールを1つだけ持っていました。彼は最後に選択した値を持っていませんでした(そして、コールはコンボボックスがフォーカスを失ったときに発射するようです)。

これはデータバインディングの仕組みで、検証が行われたときにデータがコントロールからプロパティに移動され、コントロールがフォーカスを失ったときに検証が行われます。

なぜ私はbuttonAddCityをクリックしてbuttonDisplay、diplayed市は、選択1(ないcomoboxに表示された1)でない場合

私は知りません。私はシンプルなフォーム(.Net 3.5 SP1を使用してVisual C#Express 2008を作成し、あなたのコードをほぼそのまま貼り付けて、期待どおりに動作します。コンボボックスに新しい都市が表示されます。

comboBoxCities.Focus()を追加すると、 buttonAddCity_Click()の最後まで、ValidateChildren()ではなく新しい都市が_person.BirthCityにプッシュされるようにします。

+0

Thxそれはまさに私が知らなかったものでした。データバインディングの仕組みを説明するリンクがありますか?他の質問:私はcomboboxCities.focus()を提案として追加しても、それは正常に動作しますが、なぜvalidatechildren insteedの呼び出しではうまくいかず、なぜですか? – Toto

+0

データバインディングの仕組みを説明するリンクがありますか?
悲しいことに、私は今、Visual Studio Expressを使用してC#を教えています。ドキュメントはかなり疎です。私はNoyesの "Data Forms with Windows Forms 2.0"を読んでいますが、それは主にデータベースとのデータバインディングの作成に関係しています。 – XXXXX

+0

2:SetFocus()を追加するときに「完璧に機能する」場合は、追加するときにコンボボックスに表示されるのではなく、追加するときに新しい都市がプロパティにプッシュされないことが元の質問ではおそらく意味しますそれ。繰り返しますが、問題は、SetFocus()を呼び出さないと、コンボボックスが検証を引き起こしフォーカスを失うことができないということです。 – XXXXX

関連する問題