2010-01-06 2 views
5

Quelqu'un sait comment faire cela?Liaison de données d'une énumération stockée dans un objet dans un ComboBox Winforms?

J'ai essayé this, mais il remplit juste ce ComboBox que je fais déjà.

Ce que je besoin est un moyen d'obtenir le combobox mis à jour chaque fois que la propriété ENUM sur mes changements d'objet:

DataObject.DataEnum 

mais aussi obtenir ce qui précède Enum mis à jour chaque fois que je change l'élément sélectionné dans la liste déroulante.

Est-ce possible?

Normalement, je suis habitué à faire la liaison de cette façon:

this.TextBox.DataBindings.Add ("Text", this.DataObject, "Name", false, DataSourceUpdateMode.OnPropertyChanged); 

qui fonctionne très bien.

+0

L'avez-vous essayé? – SLaks

+0

Lequel? J'ai essayé l'article mais cela ne résout pas le problème quand je mets à jour le DataObject.DataEnum, le ComboBox ne met pas à jour. Si je dois le faire manuellement aussi, alors à quoi sert la liaison de données. Je pourrais tout faire moi-même à la main. –

+0

Etes-vous peut-être ne pas augmenter une notification de modification de propriété? Windows Forms utilisera INotifyPropertyChanged ou un événement DataEnumChanged afin de détecter les modifications apportées à votre objet sous-jacent. Vous devez effectuer l'une ou l'autre pour que la liaison Windows Forms sache qu'une modification s'est produite. – Josh

Répondre

4

Vous pouvez utiliser une liaison bidirectionnelle sur la propriété SelectedItem de la zone de liste déroulante. Lorsque vous ajoutez des valeurs à la zone de liste déroulante, assurez-vous d'ajouter les valeurs enum et pas seulement les chaînes qui correspondent à leur nom d'affichage.

comboBox.Items.Add(ConsoleColor.Red); 
comboBox.Items.Add(ConsoleColor.Blue); 
// ... etc 

Maintenant, SelectedItem peut être défini ou obtenir enum au lieu d'une chaîne.

EDIT

Il semble que peut-être votre objet ne soulève pas la propriété des notifications de modification qui Windows Forms afin de détecter que des modifications à l'objet sous-jacent doivent être rafraîchi dans l'interface utilisateur. Here is an article sur la façon de le faire.

EDIT 2

Voici un exemple de code. J'ai vérifié que cela fonctionne correctement.

public partial class Form1 : Form { 

    private Person p = new Person(); 

    public Form1() { 

     InitializeComponent(); 

     comboBox1.DataSource = Enum.GetValues(typeof(Gender)); 

     textBox1.DataBindings.Add("Text", p, "Name", false, DataSourceUpdateMode.OnPropertyChanged); 
     comboBox1.DataBindings.Add("SelectedItem", p, "Gender", false, DataSourceUpdateMode.OnPropertyChanged); 

     label1.DataBindings.Add("Text", p, "Name", false, DataSourceUpdateMode.Never); 
     label2.DataBindings.Add("Text", p, "Gender", false, DataSourceUpdateMode.Never); 

    } 
    private void Form1_Load(object sender, EventArgs e) { 
     // yeah, that's right i voted for him, 
     // go ahead and downvote me 
     p.Name = "John McCain"; 
     p.Gender = Gender.Male; 
    } 
    private void Form1_Click(object sender, EventArgs e) { 
     p.Name = "Sarah Palin"; 
     p.Gender = Gender.Female; 
    } 
} 

public enum Gender { 
    Male, 
    Female 
} 

public class Person : INotifyPropertyChanged { 

    private string name; 
    private Gender gender; 

    public string Name 
    { 
     get { return name; } 
     set { 
      name = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    public Gender Gender { 
     get { return gender; } 
     set { 
      gender = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Gender")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate {}; 

} 
+0

Je peux donc utiliser ColourList.DataSource = Enum.GetValues ​​(typeof (Color)); remplir le ComboBox? –

+0

Ça fait longtemps que j'ai utilisé Windows Forms mais ouais je pense que ça devrait marcher. – Josh

+0

Merci, je vais essayer de vous le faire savoir. –

Questions connexes