2009-08-25 23 views
1

Ich kann die folgenden 2 Probleme nicht verstehen, die diesen Code gegeben werden. Ich habe eine Combobox einem benutzerdefinierten Objekt zugeordnet, und jedes Mal, wenn sich der ausgewählte Wert in der Combobox ändert, ändert sich auch das benutzerdefinierte Objekt.C# Datenbindung auf Combobox

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 - warum, wenn ich manuell zweimal in einer Zeile auswählen (oder mehr) unterschiedlichen Wert auf der Combobox, ich habe nur einen Anruf zu BirthCity.Set Entsprechung der zuletzt gewählten Wert (und der Anruf scheint Brennen nur dann, wenn die Combobox hat den Fokus verloren)?

2 - warum, wenn ich buttonAddCity klicken und dann buttonDisplay ist die diplayed Stadt nicht derjenige ausgewählt (nicht die in der comobox angezeigt)

+0

Sie sollten die Methoden GetHashCode() und Equals() überschreiben. – Rock

Antwort

2
warum, wenn ich wählen Sie zweimal manuell in einer Reihe (oder mehr) verschiedene Wert auf der Combobox, bekam ich nur einen Anruf bei BirthCity.Set mit dem letzten ausgewählten Wert (und der Anruf scheint nur zu schießen, wenn die Combobox den Fokus verloren hat)?

So funktioniert die Datenbindung, Daten werden bei der Validierung vom Steuerelement in die Eigenschaft verschoben, und die Validierung erfolgt, wenn das Steuerelement den Fokus verliert.

warum, wenn ich buttonAddCity klicken und dann buttonDisplay, die diplayed Stadt nicht derjenige ausgewählt ist (nicht die in der comobox angezeigt)

Ich weiß nicht. Ich habe ein einfaches Formular erstellt (Visual C# Express 2008 mit .Net 3.5 SP1) und den Code ziemlich wortgetreu eingefügt, und es funktioniert wie erwartet: Es wird die neue Stadt in der Auswahlliste angezeigt.

Wenn Sie ComboBoxCities.Focus() hinzufügen; Bis zum Ende von buttonAddCity_Click() werden Sie sicherstellen, dass die neue Stadt früher in _person.BirthCity verschoben wird als auf ValidateChildren().

+0

Thx war genau das, was ich nicht wusste. Haben Sie einen Link, der erklärt, wie Datenbindung funktioniert? Andere Frage: es funktioniert perfekt, wenn ich die comboboxCities.focus() wie vorgeschlagen hinzufügen, aber es funktioniert nicht mit einem Aufruf zur Validierung von Kindern, warum, warum? – Toto

+0

Haben Sie einen Link, der erklärt, wie Datenbindung funktioniert?
Leider nein. Ich lehre gerade C# mit Visual Studio Express und die Dokumentation ist eher spärlich. Ich lese gerade "Data Binding with Windows Forms 2.0" von Noyes, aber hauptsächlich geht es darum, Datenbindung mit Datenbanken zu machen. – XXXXX

+0

2: Wenn es beim Hinzufügen von SetFocus() "perfekt funktioniert", meinen Sie wahrscheinlich in der ursprünglichen Frage, dass die neue Stadt nicht in die Eigenschaft verschoben wird, wenn Sie sie hinzufügen, anstatt beim Hinzufügen in der Auswahlliste zu erscheinen es. Wenn Sie SetFocus() nicht aufrufen, kann das Kombinationsfeld den Fokus nicht verlieren *, der Überprüfung und dann Bindung verursacht. – XXXXX

Verwandte Themen