2016-04-26 11 views
1

この問題の解決策を探していましたが、十分な解決策が見つかりましたが、コードの動作は変更されませんでした。これはWinFormsにあります。列挙型の開始値を設定するComboBox

"Node"という名前のクラスの内部にあるこの列挙型の値と名前を含むフォームをComboBoxでロードしています。

class Node 
{ 
    public enum NodeType { Yield, Home, Parking, Light, None, Inbound, Outbound } 
    public NodeType Type; 
} 

私の形で、私は(コンストラクタから)のように設定されている「タイプ」という名前のComboBox、持って次に:

Node node = new Node(); 
node.Type = Node.NodeType.Home; 

Type = new ComboBox(); 
Type.Location = new Point(77, 41); 
Type.Size = new Size(121, 24); 
Type.DropDownStyle = ComboBoxStyle.DropDownList; 
Type.DisplayMember = "Name"; 
Type.ValueMember = "Value"; 
Type.DataSource = Enum.GetValues(typeof(Node.NodeType)); 
Type.SelectedValue = node.Type; 
Controls.Add(Type); 

をプログラムが実行されると、リストがすべて表示さフォームを閉じると、私は選択した値を取得することができます。 Type.SelectedValue。 私の問題は、ノードが既に設定されている値でComboBoxが開始しないことです。本質的に線

Type.SelectedValue = node.Type; 

は何もしません。私は何も変更しなかったのSelectedItemを使用してみました、と例外ArgumentOutOfRangeExceptionを引き起こし

Type.SelectedIndex = (int)node.Type; 

てきました。

私の質問は、どのように私はコンボボックスの開始値を設定するのですか?

+0

が重複する可能性を、それを設定する](http://stackoverflow.com/questions/906899/binding-an-enum-to-a-winforms-combo-box-and-then-setting-it) – RomCoo

答えて

0

あり、deafultによって梨をしたいですそのコードのいくつかの間違いです。

まず、enumはとてもDisplayMemberValueMemberを使用することができないと(デフォルト)空白のままにしておく必要があり、NameValueプロパティを(実際にはどんな性質を持っていない)がありません。つまり、SelectedValueを使用することはできません。代わりにSelectedItemを使用する必要があります。

第二に、あなたはDataSourceプロパティを設定する代わりに細かいですItemsを取り込むことにより、あなたのComboBoxのリスト部分にモードを拘束リストデータを使用しているが、データバインディングは、プロセスの後半で発生したコンストラクタItems内側そうプロパティが空で、SelectedItemは効果がありません。これを修正するには、データ初期化部分をフォームLoadのイベントに移動する必要があります。

ので、フォームのコンストラクタでは、これを持っています:

Type = new ComboBox(); 
Type.Location = new Point(77, 41); 
Type.Size = new Size(121, 24); 
Type.DropDownStyle = ComboBoxStyle.DropDownList; 
Controls.Add(Type); 

とフォームでLoadイベント - この:[WinFormsのコンボボックスに列挙型をバインドする

Node node = new Node(); 
node.Type = Node.NodeType.Home; 

Type.DataSource = Enum.GetValues(typeof(Node.NodeType)); 
Type.SelectedItem = node.Type; 
+0

問題を解決しました。エラーについても説明してくれてありがとう。 – Fisker

0

列挙型が{ "りんご"、 "梨"、 "パイナップル"}である、たとえば、あなたの列挙型からType.SelectedIndex =インデックス、そしてあなたはとてもType.SelectedIndex = 1

+0

これは私が試したものですType.SelectedIndex =(int)node.Typeを実行します。 ArgumentOutOfRangeExceptionが発生します。たとえ、(int)node.Typeの代わりに2を入力しても、何かが発生します。 – Fisker

+0

Lightを選択する場合は、Type.SelectedValue = node.Type.Lightを試してください。 –

+0

試行:Type.SelectedValue = Node.NodeType。光; ComboBoxはまだ列挙子の最初の値である "Yield"で始まります。 – Fisker