2017-03-28 28 views
1

ListBoxコントロールには最大4つの項目があります。文字列変数に表示されるテキストを割り当てたいが、string Twoになるとすぐにインデックスが範囲外であるという問題に遭遇している。私はなぜこれが起こっているのかを知っています(リストボックス内の1つの項目だけですが...)。ListBox項目を別々の変数に格納する

私はおそらくこれに対処するためのif文のいくつかの種類を構築することができますが、それは以下の2項目以上1など

だ場合、私はそれを行うためのより効率的な方法があるかもしれないと思うのではなく、チェック私のコードの

シンプルバージョン:

public void button1_Click(object sender, EventArgs e) 
{ 
    if (listBox1.Items.Count < 4) { 
     listBox1.Items.Add(comboBox1.Text); 
    } else { 
     System.Windows.Forms.MessageBox.Show("Too many"); 
    } 

    string One = listBox1.Items[0].ToString(); 
    string Two = listBox1.Items[1].ToString(); 
    string Three = listBox1.Items[2].ToString(); 
    string Four = listBox1.Items[3].ToString(); 
} 

注私は、配列を反復処理する能力を持っているか、アクセスしていない別のアプリケーション内の変数にアクセスする必要があるように私は、このために配列を使用することはできませんそのインデックス。

+2

があまりにも共通言語ランタイムを使用して他のアプリケーションでnullにしたくない場合は

??オペレータが使用されていますか? – Archimedes

+0

アイテム( 'if-else'パーツ)の追加とアイテム(' One、Two..'パーツ)の取得のために別のメソッドが必要な場合があります – SWeko

+0

はい、他のアプリケーションは.NETベースです。基本的に何が起こるかは、ウィザードで宣言されたすべての変数(このコードが存在する私のフォーム)は、Microsoft Wordのマージコードを使用して参照されるデータテーブルに入れられるため、対処する能力はありません配列、列のみ、およびデータテーブル内の1つの行 –

答えて

1

あなたはあなたのためのコピーを処理するための一時的な配列を作成することができます。

if (listBox1.Items.Count < 4) { 
    listBox1.Items.Add(comboBox1.Text); 
} else { 
    System.Windows.Forms.MessageBox.Show("Too many"); 
} 

string[] ListItemsArray= new string[4]; 
listBox1.Items.CopyTo(ListItemsArray, 0); 

//Then you can leave this here: 
string One = ListItemsArray[0] ?? ""; 
string Two = ListItemsArray[1] ?? ""; 
string Three = ListItemsArray[2] ?? ""; 
string Four = ListItemsArray[3] ?? ""; 

listBox1.Items.CopyTo()方法がhereを説明しています。あなたは、任意の値が

+0

すべての良い答えが、私はこれが最も好感が持てるように思えます。ありがとう! –

0

実際には最大4個のアイテムを手動でノックアウトすればいいですか?

string One = ""; 
string Two = ""; 
string Three = ""; 
string Four = ""; 

if (listBox1.Items.Count >= 1) 
{ 
    One = listBox1.Items[0]; 
} 
if (listBox1.Items.Count >= 2) 
{ 
    Two = listBox1.Items[1]; 
} 
if (listBox1.Items.Count >= 3) 
{ 
    Three = listBox1.Items[2]; 
} 
if (listBox1.Items.Count >= 4) 
{ 
    Four = listBox1.Items[3]; 
} 

それはエレガントではなく、仕事が行われています。

+0

それは私がやろうとしていたものですが、もっと効果的で将来的な証明方法があるのか​​どうか疑問に思いました。 –

0

あなたはあなたが範囲外のインデックスにアクセスしようとしたことがない listBox.Itemsためのループを使用することができます。

あなたはまずそのような文字列の配列を作成することができます。

string[] names = new string[] { "", "", "", "" }; 

次にあなたがリストボックスの項目をループするために使用していて、ちょうど等しくなるように作成された文字列の配列の文字列を設定することができます

for (int i = 0; i < listBox.Items.Count; i++) 
     { 
      names[i] = listBox.Items[i].ToString(); 
     } 

最後に、あなたとあなたの元の変数設定:

string one = names[0]; 
string two = names[1]; 
string three = names[2]; 
string four = names[3]; 
012のようにはlistBox [インデックス] .ToString()には何でもします

上記のいずれかの文字列が空の文字列である場合、リストボックスのその位置にアイテムがないこと、またはリストボックスにあるアイテムがToString()を実装して空の文字列を返すことを意味します。

私はあなたの問題を理解しているかどうかはわかりませんが、私はそのようなことをします。

関連する問題