2009-05-15 3 views
3

ComboBoxには、DataSourceプロパティで設定されたComboBoxがあるとします。 ComboBoxの各項目はカスタムオブジェクトで、ComboBoxはDisplayMemberValueMemberに設定されています。DataSourceでComboBoxの項目を取得する

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; 

ここで問題は、UIで表示される文字列として項目を読み取ることです。 ComboBoxの各アイテムのタイプがわからないことを考慮してください(CustomItemは私には分かりません)

これは可能ですか?

答えて

3

バインディング:

CustomItem ci = ComboBox1.SelectedValue as CustomItem; 

編集:

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

は、アイテムの取得、あなたが取得したいことすべては、コンボボックスの表示値のすべてのリストがある場合

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

そのを。 –

2

インターフェイスを作成します(例:ICustomFormatter)。これらのカスタムオブジェクトを実装します。

interface ICustomFormatter 
{ 
    public string ToString(); 
} 

次にToString()メソッドを呼び出します。

EDIT:Decoratorのパターンへのリンク。

+0

これは唯一の方法ですか? CustomObjectクラスを変更することはできません。他の方法はありますか? –

+0

これらのカスタムオブジェクトの周りにデコレータを作成します。 –

+0

オブジェクトはToString()メソッドを定義します。これをやりたければ、新しいインターフェースを実装するのではなく、オーバーライドするだけです。 –

2

ValueMemberとDisplayMemberをリフレクションで取得できるはずです。しかし、コンボボックスを調べるのはやや簡単かもしれません。次のように動作しますが、SuspendUpdateなどで囲むことができます。

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

少し計算コスト、リフレクションはあなたがやりたいことができますが:項目としませ選ば約1

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; 
    } 
関連する問題