2009-10-01 7 views
1

Je lie une classe à un formulaire Windows en utilisant la source de données d'objet: la liaison des propriétés simples aux textbox fonctionne bien, mais j'ai besoin de lier les propriétés enum aux comboboxes, telles que:Comment lier enum à winform combobox en utilisant objectdatasource

public enum MyEnum 
    { 
     Val1, 
     Val2, 
     Val3 
    } 
    private MyEnum enumVal; 

    public MyEnum EnumVal 
    { 
     get { return enumVal; } 
     set { enumVal = value; } 
    } 

Comment accomplir cela en utilisant une source de liaison? J'ai essayé de diverses manières, mais aucune de ces œuvres. Merci

+0

J'ai besoin la liste déroulante reste synchronisée avec la propriété EnumVal de la classe, c'est-à-dire si je change la valeur EnumVal, la liste déroulante reflète la modification, et viceversa, si je change la valeur de liste déroulante, la propriété EnumVal est également mise à jour. –

Répondre

3

je le fais comme ça, mais peut-être il existe une meilleure façon:

List<ListItem<MyEnum>> enumVals = new List<ListItem<MyEnum>>(); 

foreach(MyEnum m in Enum.GetValues (typeof(MyEnum)) 
{ 
    enumVals.Add (new ListItem<MyEnum>(m, m.ToString()); 
} 

myComboBox.DataSource = enumVals; 
myComboBox.ValueMember = "Key"; 
myComboBox.DisplayMember = "Description"; 

Notez que ListItem<T> est une classe personnalisée que j'ai créé, qui contient une propriété clé et une propriété Description.

Afin de garder votre propriété synchronisé avec la valeur sélectionnée de la zone de liste déroulante, vous devrez: - ajouter un DataBinding au combobox, de sorte que la SelectedValue du combobox est lié à votre propriété - assurez-vous que La classe qui contient la propriété, implémente INotifyPropertyChanged, de sorte que lorsque vous modifiez la propriété, la valeur sélectionnée de la liste déroulante est également modifiée.

myComboBox.DataBindings.Add ("SelectedValue", theBindingSource, "YourPropertyName"); 

et

public class TheClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private MyEnum _myField; 

    public MyEnum MyPropertyName 
    { 
     get { return _myField; } 
     set 
     { 
     if(_myField != value) 
     { 
      _myField = value; 
      if(PropertyChanged != null) 
        PropertyChanged ("MyPropertyName"); 
     } 
     } 
    } 
} 
+0

Ce serait bien ... mais comment le faire automatiquement synchronisé avec la propriété EnumVal? J'utilise ObjectDataSource avec la liaison de données automatique. –

+0

Parfait, ça marche! Je vous remercie! –

1

J'ai été la recherche de ce blogs de qualité en ce qui concerne ce créneau. La recherche dans Yahoo m'a conduit ici, je viens de trouver ce genre de lectures satisfaisantes que je cherchais. J'ai trouvé cette réponse sur le net, j'espère que cela vous aidera hors de la boîte. Ceci est assez simple ...

Définir le ENUM par exemple:

public enum MyEnum{ 
    ItemOne, 
    ItemTwo, 
} 

Dans la forme prévue le DataSource du combobox aux valeurs du ENUM par exemple:

myCombo.DataSource = System.Enum.GetValues(typeof(MyEnum)); 

Pour avoir le combo sélectionne automatiquement une valeur basée sur un objet lié, définit la liaison de données du combo par exemple:

class MyObject{ 
    private MyEnum myEnumProperty; 
    public MyEnum MyEnumProperty{get {return myEnumProperty;}} 
} 
MyObject myObj = new MyObject(); 
myCombo.DataBindings.Add(new Binding("SelectedIndex", myObject, "MyEnumProperty"); 
Questions connexes