2016-06-26 4 views
4

winformに2つのコンボボックスがあり、リストの "MyList"の値がすべて選択されています。最初の、以後のインデックス。しかし、アイテムがコンボボックスにロードされるときに問題があると私は思う。 BOX2ボックスは、このエラーがスローされた時点でリストからすべての値を持っているにもかかわらず、そのコレクション内に項目を持っていないので、フォームロード前にデータバインディングが機能しない - フォームロード後にのみ初期化される項目

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     ComboBox box = new ComboBox(); 
     box.DropDownStyle = ComboBoxStyle.DropDownList; 
     box.DataSource = MyList.ToList(); 
     box.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged); 
     Tab_Page.Controls.Add(box); 

     ComboBox box2 = new ComboBox(); 
     box2.DropDownStyle = ComboBoxStyle.DropDownList; 
     foreach (object o in box.Items) 
      { 
       box2.Items.Add(o); 
      } 
     Tab_Page.Controls.Add(box2); 
     box2.Items.RemoveAt(0); 
     //This last line throws an error 
     //"InvalidArgument=Value of '0' is not valid for 'index'." 
    }} 

エラーです。

私はアイテムコレクションにアイテムがどのようにロードされているのか、どのように修正できるのでしょうか?

答えて

2

フォームとコントロールがCreatedステータスになる前にフォームとコントロールが表示される前に、データバインディングは機能しません。ステータスにはありません。

ここでの問題は上記の事実によるものです。データバインディングを使用してコンストラクタ内の最初のコンボにアイテムを追加しています。上記のように、データバインディングはそこでは機能しません。したがって、ループ内でItemsコンボの最初のコレクションは空ですが、2番目のコンボ。あなたはこれらのオプションのいずれかを使用して問題を解決することができます

  • は、最初のコンボのItemsに直接値を追加します。box.Items.AddRange(MyList.ToArray());
  • 形のShownまたはLoadイベントにコードを入れてください。
  • 最初のコンボのItemsを取得する前に、フォームを表示します。たとえば、最初のコンボのDataSourceに値を割り当てた後、this.Show();を呼び出します。 this.Show();またはthis.Visible = true;を呼び出すとフォームが表示され、表示されるコントロールはすべてCreatedになります。したがって、コントロールは可視であり、可視フォームの可視部分のメンバーでなければなりません。
+0

詳細で迅速な回答をいただきありがとうございます。 :)それは、 "AddRange"メソッドで動作しましたが、教育的価値のために - 私も "this.Show();を試しましたと "this.Visible = true;" Form1()メソッド(またはクラスなど)内の他のものの前に置くことで、同じエラーが発生しました。 – mathgenius

+0

あなたは歓迎です:)私はもう一度それをチェックしました。 'this.Visible = true;'または 'this.Show();'はデータバインディングを使いたいときの主な解決法です。 forループの前のどこにでも置くだけで十分です。あなたが投稿した正確なmcveをテストしました。しかし、とにかく、そのコンセプトは本当に重要で検証可能です。 –

関連する問題