2009-05-15 12 views
3

Bedenken Sie, dass es eine ComboBox, die durch die Datasource-Eigenschaft aufgefüllt wird. Jedes Element in der ComboBox ist ein benutzerdefiniertes Objekt und die ComboBox wird mit DisplayMember und ValueMember festgelegt.die Elemente einer ComboBox mit seiner Datasource Erste gefüllt

Jetzt ist das Problem, dass ich die Elemente als Zeichenfolge lesen möchte, die in der Benutzeroberfläche gerendert werden. Man bedenke, dass ich weiß nicht, die Art der jedes Element in der ComboBox (CustomItem ist mir nicht bekannt)

Ist das möglich?

Antwort

3

Bindung:

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

Erhalten des Einzelteils:

CustomItem ci = ComboBox1.SelectedValue as CustomItem; 

edit: Wenn alles, was Sie erhalten möchten eine Liste aller von der Anzeigewerte der Combobox

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

Es geht um die Elemente und nicht die ausgewählten. –

2

Erstellen Sie eine Schnittstelle, z. B. ICustomFormatter, und lassen Sie diese benutzerdefinierten Objekte implementieren.

interface ICustomFormatter 
{ 
    public string ToString(); 
} 

Dann rufen Sie die ToString() Methode.

EDIT: Link zu Decorator Muster.

+0

Ist das der einzige Weg ?? Ich kann die CustomObject-Klasse nicht ändern. Gibt es einen anderen Weg ??? –

+0

Erstellen Sie einen Dekorator um diese benutzerdefinierten Objekte ... –

+0

Objekt definiert eine ToString() -Methode. Wenn Sie dies tun wollten, überschreiben Sie das einfach, anstatt eine neue Schnittstelle zu implementieren. –

2

sollten Sie in der Lage sein, bei Valuemember und Display durch Reflexion zu erhalten. Aber die Abfrage der Combobox könnte etwas einfacher sein. Das Folgende funktioniert, aber vielleicht möchten Sie es mit SuspendUpdate oder etwas umgeben.

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

Obwohl etwas rechnerisch teuer, könnte Reflexion tun, was Sie wollen:

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; 
    } 
Verwandte Themen