2009-05-15 8 views
3

Considérons qu'un composant ComboBox est rempli à l'aide de sa propriété DataSource. Chaque élément de la zone de liste déroulante est un objet personnalisé et la zone de liste déroulante est définie avec DisplayMember et ValueMember.Obtention des éléments d'une zone de liste déroulante avec sa source de données remplie

IList<CustomItem> aItems = new List<CustomItem>(); 
//CustomItem has Id and Value and is filled through its constructor 
aItems.Add(1, "foo"); 
aItems.Add(2, "bar"); 

myComboBox.DataSource = aItems; 

Maintenant le problème est que, je veux lire les éléments comme chaîne qui sera rendue dans l'interface utilisateur. Considérez que je ne connais pas le type de chaque article dans le ComboBox (CustomItem est inconnu pour moi)

Est-ce possible?

Répondre

3

Reliure:

ComboBox1.DataSource = aItems; 
ComboBox1.DisplayMember = "Value"; 

Obtenir l'article:

CustomItem ci = ComboBox1.SelectedValue as CustomItem; 

edit: Si tout ce que vous voulez obtenir une liste de toutes les valeurs d'affichage du combobox

List<String> displayedValues = new List<String>(); 
foreach (CustomItem ci in comboBox1.Items) 
    displayedValues.Add(ci.Value); 
+0

Son sur les éléments et non celle sélectionnée. –

2

Créez une interface, par exemple ICustomFormatter, et demandez à ces objets personnalisés de l'implémenter. Puis, appelez la méthode ToString().

EDIT: lien vers le modèle Decorator.

+0

Est-ce le seul moyen? Je ne peux pas modifier la classe CustomObject. Est-ce qu'il y a un autre moyen ??? –

+0

Créez un décorateur autour de ces objets personnalisés ... –

+0

L'objet définit une méthode ToString(). Si vous vouliez le faire, vous le remplaceriez au lieu d'implémenter une nouvelle interface. –

2

Vous devriez pouvoir accéder à ValueMember et DisplayMember par réflexion. Mais interroger la combobox pourrait être un peu plus facile. Ce qui suit fonctionnera, mais peut-être que vous voulez l'entourer de SuspendUpdate ou quelque chose.

string s = string.Empty; 
int n = comboBox1.Items.Count; 

for (int i = 0; i < n; i++) 
{ 
    comboBox1.SelectedIndex = i; 
    s = s + ';' + comboBox1.Text; // not SelectedText; 
} 
2

Bien qu'un peu plus cher informatiquement, la réflexion pourrait faire ce que vous voulez:

using System.Reflection;  
private string GetPropertyFromObject(string propertyName, object obj) 
    { 
     PropertyInfo pi = obj.GetType().GetProperty(propertyName); 
     if(pi != null) 
     { 
      object value = pi.GetValue(obj, null); 
      if(value != null) 
      { 
       return value.ToString(); 
      } 
     } 
     //return empty string, null, or throw error 
     return string.Empty; 
    } 
Questions connexes