2016-11-12 8 views
0

コンボボックスの値にアクセスしようとしています。アイテムの値はMyClassタイプですWindowsフォームでComboboxアイテムのMemberValueにアクセスするにはどうすればいいですか?

List<MyClass> myIitemsList = getMyClassItemsMethod(); 
if (myIitemsList .Count > 0) 
{ 
    for (int i = 0; i < myIitemsList .Count; i++) 
    {   
     List<MyClass> selectedMyClassItems = myIitemsList .FindAll(x => x.myClassNumber == i); 
     string itemtext = "MyClass " + i ; 
     myComboBox.Items.Add(new { itemtext, ValueMember = selectedMyClassItems}); 
    } 
} 

ここは私のサンプルコードです。今私はValueMemberにアクセスしようとしています。コンボボックス内のアイテムを選択すると、選択したアイテムを取得できます。デバッグウォッチwindoで

var ddlMyClassSelectedItem = myComboBox.SelectedItem; 

、私は、項目のValueMemberではリストとしての項目がありますが、私はそれらを取得/にアクセスする方法がわからないことを確認することができています。

+2

あなたのコードがコンパイルされませんComboItem型であることを知って簡単です。あなたが何を求めているのかは不明です。 –

+0

クラスがToString()メソッドをオーバーライドし、MyClassのインスタンスを記述するために必要なものを返し、コンボのデータソースをリストに設定し、コンボのValueMemberプロパティをMyClassの識別メンバーに設定します。 – Steve

+0

データソースを使用して、自分のコードに示すようにforループを手動で追加しています。 – user3726459

答えて

1

はあなたが何をやったかについて議論します。どのようにあなたのメンバーを取得、少し興味があるあなたは、このようにそれを行うことができますが、

myComboBox.DisplayMemeber = "Display"; 
myComboBox.ValueMemeber = "Value"; 
myComboBox.DataSource = 
    getMyClassItemsMethod().OrderBy(c => c.myClassNumber). 
    Select(c => new { Display = "Memeber: " + c.myClassNumber, Value = c}).ToList(); 

それは動作しますと、今、あなたはmyComboBox.SelectedItemを使用してアイテムを選択しました。しかし、あなたのアイテムが実際には匿名のタイプであり、簡単にキャストすることができないという問題に直面しています。このノートで

は、なぜあなたは

class ComboItem 
{ 
    public string Display {get; set;}   
    public MyClass Value {get; set;} 
} 

のようなタイプを宣言し、このタイプの代わりに、匿名型を使用しないでください。すなわち、new {...}の代わりにnew ComboItem {...}を実行します。さて、これは

var ddlMyClassSelectedItem = (ComboItem)myComboBox.SelectedItem; 
Console.WriteLine(ddlMyClassSelectedItem.Value.myClassNumber); 

今、あなたはddlMyClassSelectedItem

+0

ComboItemクラスを使用すると、完全に機能しました。ありがとう! – user3726459

0

コンボボックス、使用に追加する:アイテムを取得する場合、

myComboBox.Items.Add(selectedMyClassItems); 

使用:

List<MyClass> ddlMyClassSelectedItem = myComboBox.SelectedItem as List<MyClass>; 

そして最後に、MyClassの中で、(ToStringメソッドをオーバーライドするので、あなたが好きなようにコンボボックスがそれをレンダリングすることができます):その後、

public override string ToString() 
    { 
     return "MyClass " + myClassNumber; 
    } 
+0

私はうまくいくソリューションを見つけましたが、それはきれいではありません。私は以下のソリューションを追加しています。 – user3726459

0
List<MyClass> myIitemsList = getMyClassItemsMethod(); 
if (myIitemsList .Count > 0) 
{ 
    for (int i = 0; i < myIitemsList .Count; i++) 
    {   
     List<MyClass> selectedMyClassItems = myIitemsList .FindAll(x => x.myClassNumber == i); 
     string itemtext = "MyClass " + i ; 
     myComboBox.Items.Add(new KeyValuePair<string, List<SwitchPort>>(itemtext, 
          selectedMyClassItems); 
    } 
} 

選択した項目から値を取得します。

var item = myComboBox.SelectedItem; 
KeyValuePair<string,List<MyClass>> selectedItemsPair = (KeyValuePair<string,List<MyClass>>)item; 
List<MyClass> myClassList = selectedItemsPair.Value; 

これで唯一の問題は、私のようCOMBOXショーでアイテムということである。

My class 1, [System.Collection] 
My Class 2, [System.Collection] 
My Class 3, [System.Collection] 
My Class 4, [System.Collection] 
My Class 5, [System.Collection] 
関連する問題