2011-08-02 181 views
2

C#でコンボボックスを作成しようとしていますが、何らかの理由でアイテムが表示されません。C#Comboboxでアイテムが表示されない

public List<string> items 
{ 
    set 
    { 
     combobox.Items.Clear(); 
     foreach(string s in value) 
     { 
      combobox.Items.Add(s); 
     } 
     combobox.Update(); 
    } 
} 

これは信じられないほど簡単なコードのように思えます。私は単に何が間違っているかを見ることはできません。 それはこのように呼ばれている:

興味深いことに
private void StoreNames(List<string> names) 
{ 
    if (selectionForm.InvokeRequired) 
     selectionForm.Invoke((MethodInvoker)delegate { selectionForm.items = names; }); 
    else 
     selectionForm.items = names; 
} 

、trueを返しますInvokeRequiredたときに動作しているようですが、それはfalseを返したときに動作しません。

編集: selectionForm.IsHandleCreatedは現在falseです。これはInvokeRequiredをfalseに戻しますが、セッターを定期的に呼び出すことは機能しません。 IsHandleCreatedがfalseに設定されている理由がわかりません。フォームはShow()nでした。

+0

呼び出しコードとは何ですか? –

+0

どのスレッドがプロパティを設定していますか?それはタイマースレッドかメインの "windowsメッセージループ"ですか? –

+0

あなたは良い答えを得るためにもっと多くの情報を入れる必要があると思います。 – hspain

答えて

1

あなたのコードがうまくいかない理由はわかりません。私は試してみましたが、うまくいきます。

ただし、以下のコードも機能しています。このようにすると、問題は解決します。これは、あなたがその財産を通過する必要がある他の理由はないと推測します。それは、物事を行うのは珍しい方法です。

public void StoreNames(List<string> input) 
{ 
    if (comboBox1.InvokeRequired) 
     comboBox1.Invoke((MethodInvoker)delegate { 
      StoreNames(input); 
     }); 
    else 
    { 
     comboBox1.Items.Clear(); 
     comboBox1.Items.AddRange(input.ToArray()); 
    } 
} 

ここで私達はちょうどまっすぐコンボボックス上items.AddRange()メソッドにリストを渡します。

これはあなたのためにはうまくいかないと思いますが、私はbackgroundworker(InvokeRequiredが真である)とメインUIスレッドの両方から試してみました。

+0

私は同意する、私は追加が問題だとは思わない。問題の内容を示すのに役立つかもしれない質問に、いくつかの追加情報を提供しました。 – Daniel

+0

@Daniel - あなたのリストを設定するコードはどこにありますか?これは、フォームウィンドウ(ハンドル)が実際に設定される前に行っているようです。おそらくフォームのロードイベント内にコードを入れてみるか、プレゼンターがそのデータを設定している何らかの種類のModelViewPresenterパターンを試している場合は、プレゼンターからビューにコールバックを渡すなど、フォームが初期化されていることに非常に注意してください。 –

0

これは、コンボボックスとコンボボックス1の両方を指すタイプミスですか?おそらくあなたの誤りです。

+0

はい、それはタイプミスでした。ありがとうございました。 – Daniel

0

リストが表示されているときや、スクロールできないときと同じように「表示されない」という意味ですか?

コンボボックスには、表示内容に影響を与える多くのプロパティがあります。 combobox.MaxDropDownItemsの値を大きくしてみてください。

+0

私はそれらを見ることはできません。 MaxDropDownItemsは問題ありません。なぜなら、私は1つのアイテムも見ることができないからです。 – Daniel

+0

'Combobox.Items.Count'は1に等しく、' MaxDropDownItems'は8に等しい。ドロップダウンメニューは空である。 – Daniel

0

このスレッドの他の回答は、リストを提供するコードを手に入れることができれば、実際にこれを行う方法を示しています。あなたができないように聞こえるので、私はこの答えを提供しています。

プロパティが呼び出されたときにコンボボックスがまだ初期化されていないということが重要な問題です。それに対する最善の答えは、これがコーリングコード内で起こらないことを確認することです。

できない場合は、プロパティを設定してからコンボボックスに入力するまで待つ必要があります。

これは、プロパティ設定ツールで設定されるプライベートリストを持つことです。フォームのロードイベントの中で私はプライベートリストがnullでないように待ってコンボボックスに割り当てるコードを(おそらくバックグラウンドワーカー内に)配置します。

Jon Skeet hereによってこの記事をご覧ください。ここで、別のスレッドによって変数が正しく設定されるのを正しく待つ方法について説明します。これを行うときに注意する必要があります - スレッドの問題は厄介かもしれません。

+0

私はちょっと時間が足りませんし、コードもいくつか提供しています。何かの例が必要な場合はコメントを残してください。 –

+0

ありがとうございます。私は実際問題が何かを考え出した。私のプロジェクトには外部デバイスとの通信が含まれており、通信を処理するシングルトンクラスがあります。そのメソッドの1つが私のフォームのメソッドに 'delegate'dされていました。フォームを破棄すると、私はデリゲートを忘れてしまいました。私はなぜそれがいつも最初に働いたが、2回目ではなかったことについて、とてもうんざりしていた! – Daniel

関連する問題