2009-08-25 5 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 - 내가 수동으로 콤보 상자에 다른 값을 두 번 연속 선택 (또는 그 이상)의 경우, 나는 그가 기호와 BirthCity.Set에 마지막으로 선택한 값을 하나의 전화를 받았습니다 (그리고 호출하는 경우에만 발사 보인다 이유 콤보 상자가 초점을 잃었습니까?)

2 - 그때 buttonAddCity 및 buttonDisplay을 클릭하면 미리 보여줍니다 도시는 선택된 하나 (안 comobox에 표시되는 것)

+0

GetHashCode() 및 Equals() 메서드를 재정의해야합니다. – Rock

답변

2
수없는 이유를 내가 왜 수동으로 (또는 그 이상)의 서로 다른 행에 두 번 선택하면 가치, 콤보 상자에, 나는 한 번만 BirthCity.Set 그는 마지막으로 선택한 가치 (와 통화가 콤보가 초점을 잃었을 때 발사 것) 전화를 했어?

데이터 바인딩이 작동하는 방식으로, 유효성 검사가 발생할 때 컨트롤에서 속성으로 데이터가 이동되고 컨트롤에서 포커스를 잃을 때 유효성 검사가 발생합니다. 내가 buttonAddCity 다음 buttonDisplay을 클릭하면 미리 보여줍니다시 선택한 하나 (안 comobox에 표시되는 것) 나도 몰라

없는 이유

. 간단한 양식 (.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는 "Windows Forms 2.0의 데이터 바인딩"을 읽었지만 대부분 데이터베이스와의 바인딩 작업에 관심이 있습니다. – XXXXX

+0

2 : SetFocus()를 추가 할 때 "완벽하게 작동하는"경우, 추가 할 때 콤보 상자에 나타나지 않고 새 도시가 추가 될 때 새 도시가 속성에 푸시되지 않는다는 것을 원래 질문에서 의미 할 수 있습니다 그것. 다시 말하지만, 문제는 SetFocus()를 호출하지 않으면 콤보 박스가 유효성 검사를 일으킨 다음 바인딩을 잃을 수 없다는 것입니다. – XXXXX

관련 문제