2017-01-06 13 views
0

PictureBox'spictureBox11pictureBox30)を配列に追加する必要があります。c#Windowsフォームで画像ボックスを配列に追加する

ので、代わりにこのようのPictureBoxのを追加:

PictureBox[] Coins = new PictureBox[20]; 
Coins[0] = pictureBox11; 
... 
Coins[19] = pictureBox30; 

私は(動作しません)このようなサイクルのために書いた:

for (int i = 11; i < 31; i++) 
    { 
     for (int j = 0; j < Coins.Length; j++) 
     { 
      Coins[j] = (PictureBox)Controls.Find(
          "pictureBox" + i.ToString(), true)[0]; 
     } 
    } 

Iので、どこかで小さな愚かな間違いがあるかもしれません別のもののために同じサイクルを使用し、それは動作する、idk、たぶん私は盲目であり、間違いを見ることができない。

多分それが関連しているので、私は、私は配列の要素のために割り当てていたコードが含まれます:最初のコードに示すように、私はそれらを追加する場合

 for (int i = 0; i < Coins.Length; i++) 
     { 
      if (player.Bounds.IntersectsWith(Coins[i].Bounds)) 
      { 
       Coins[i].Visible = false; 
      } 
     } 

すべてが正常に動作しますが、それは非常に実用的ではありません。

なぜ私は私のために働いて書いた2番目のコード(forサイクル)はありませんか?

アレイに複数のピクチャボックスを追加するより良い方法はありますか?

+0

どのような質問ですか? – jonathana

+0

編集しました。質問 - アレイにピクチャボックスを追加するサイクルが私のものではないのはなぜですか? – Raiviz

+0

'Coins'のデータ型は何ですか? – jonathana

答えて

0

私はあなたがこれをもっと複雑にしていると推測しています。私はあなたがと言うとき、ピクチャボックス(pictureBox11〜pictureBox30)を配列に追加する必要があると思います。あなたのフォームに30+ PictureBoxがあることを意味し、各PictureBoxはそれぞれが "pictureBoxX"という名前のような命名規則を使用します( "X"は1,2,3 ... 30,31です)。次に、フォーム上に "PictureBoxes"の(連続する?)グループを表示して、不可視にしたいとします。私はこれが正しいことを願っています。

ピクチャボックスを表示しないようにするには、配列が必要ではないと思います。名前が "pictureBoxX"という形式の文字列と一致する場合は、単にピクチャボックスをループし、見えなくするだけです。私はIndexsAreValidメソッドを使用して、開始インデックスと終了インデックスを検証しました。また、このコードの下の配列実装のコードでも使用されます。あなたは、その後、以下のコードは動作するはず返さPictureBox配列を持たなければならない場合

は、アレイ

private void SetPictureBoxesInvisible(int start, int end) { 
    int size = -1; 
    string targetString = ""; 
    if (IndexsAreValid(start, end, out size)) { 
    for (int i = start; i < end + 1; i++) { 
     try { 
     targetString = "pictureBox" + i; 
     PictureBox target = (PictureBox)Controls.Find(targetString, true)[0]; 
     if (target != null) { 
      target.Visible = false; 
     } 
     } 
     catch (IndexOutOfRangeException e) { 
     return; 
     } 
    } 
    } 
} 

なしPictureBoxesが見えないことを確認します。

まず、PictureBoxの配列を取得するには、配列を格納する必要があります。しかし、まず、あなたはそれをどれだけ大きくするかを知る必要があります。投稿されたコードから、画像ボックス11〜30を取得して配列に入れたいと思うようです。したがって、これらの数値からサイズを得ることができます。つまり、30-11 = 19 +1 = 20です。単に配列を作成し、すべての画像ボックスをループして、pictureBox11-pictureBox30を取得します。終了したら、この配列を使ってこれらの `PictureBoxes 'を見えなくすることができます。

tryParseと同様のメソッドIsValidPicを作成して、指定されたインデックス(1,2,3..30)が有効かどうかを検証しました。範囲外の場合は、その値を無視するだけです。これにより、必要な画像ボックスが連続していない場合に個々の画像ボックスをつかむことができます。メソッドをテストするためにいくつかのボタンを使用しました。

これが役に立ちます。

private PictureBox[] GetPictureBoxes(int start, int end) { 
    int size = - 1; 
    if (IndexsAreValid(start, end, out size)) { 
    PictureBox curPic = null; 
    PictureBox[] allPics = new PictureBox[size]; 
    int index = 0; 
    for (int i = start; i <= end; i++) { 
     if (IsValidPic(i, out curPic)) { 
     allPics[index] = curPic; 
     index++; 
     } 
    } 
    return allPics; 
    } 
    else { 
    return new PictureBox[0]; 
    } 
} 

private Boolean IndexsAreValid(int start, int end, out int size) { 
    if (start < 1 || end < 1) { 
    size = -1; 
    return false; 
    } 
    if (start > end) { 
    size = -1; 
    return false; 
    } 
    size = end - start + 1; 
    return true; 
} 

private Boolean IsValidPic(int index, out PictureBox picture) { 
    string targetName = "pictureBox" + index; 
    try { 
    PictureBox target = (PictureBox)Controls.Find(targetName, true)[0]; 
    if (target != null) { 
     picture = target; 
     return true; 
    } 
    picture = null; 
    return false; 
    } 
    catch (IndexOutOfRangeException e) { 
    picture = null; 
    return false; 
    } 
} 

private void ResetAll() { 
    foreach (PictureBox pb in this.Controls.OfType<PictureBox>()) { 
    pb.Visible = true; 
    } 
} 

private void button1_Click(object sender, EventArgs e) { 
    TurnInvisible(2, 3); 
} 

private void button3_Click(object sender, EventArgs e) { 
    TurnInvisible(11, 30); 
} 

private void button4_Click(object sender, EventArgs e) { 
    TurnInvisible(1,7); 
} 

private void TurnInvisible(int start, int end) { 
    PictureBox[] pictureBoxesToChange = GetPictureBoxes(start, end); 
    foreach (PictureBox pb in pictureBoxesToChange) { 
    if (pb != null) 
     pb.Visible = false; 
    } 
} 

private void button2_Click(object sender, EventArgs e) { 
    ResetAll(); 
} 
+0

最初のコードは私のために働いた、ありがとう! – Raiviz