0

ナインメンズモリスゲームを実装したいです。私は24個のピクチャーボックスを備えたボードを持っており、左側と右側に9個の赤いピクチャーボックスと9個の緑のピクチャーボックスがあります。
それらをリストに追加したい:

 List<PictureBox> ls = new List<PictureBox>();
 private void Form1_Load(object sender, EventArgs e)
    {


        for (int i = 1; i <= 24; i++)
        {
            PictureBox p = new PictureBox();
            p.Name = "pictureBox" + i;
            ls.Add(p);
        }

    }

大丈夫ですか?

そして、次のようなことを行うことは可能ですか。24個の画像ボックスの1つをクリックし、その画像ボックスの背景を1回は緑、もう1回は赤にしますか?
再帰関数など、画像ボックスをクリックしたときに認識できるものを意味し、リストでその画像ボックスを検索して、彼の背景色を変更しますか?

ここに画像の説明を入力してください

4

3 に答える 3

4

ここでは、pictureBox リストは必要ありません。

for (int i = 1; i <= 24; i++)
{
     PictureBox p = new PictureBox();
     p.Click += p_Click;
     //of course, somecontrol.Controls.Add(p);
     //for ex: this.Controls.Add(p);
}

-

void p_Click(object sender, EventArgs e)
{
    ((PictureBox)sender).BackColor = Color.Green;
}

編集

すべてのpictureBoxesにイベントハンドラーを追加しようとしているようです

**parentControl**.Controls.OfType<PictureBox>()
                 .ToList().ForEach(p => p.Click+=p_Click);
于 2013-03-19T21:47:12.507 に答える
2

24 個の PictureBoxes のリストは、プレーヤーの部下を配置できる 9 人のモリス ボード上のポイントを表すと想定しています。

I4V は正しく、各画像ボックスにクリック ハンドラーを追加するだけで済みます。背景を緑と赤の間で交互に表示したい場合は、元のリストを保持しますが、そこにクリック ハンドラーを追加します。

for (int i = 1; i <= 24; i++)
{
    PictureBox p = new PictureBox();
    p.Name = "pictureBox" + i;
    p.Click += p_Click; // <----------
    ls.Add(p);
}

そして、i4v のクリック ハンドラーを変更して、現在の背景色を使用して新しい背景色を決定します。

void p_Click(object sender, EventArgs e)
{
    PictureBox p = (PictureBox)sender);
    p.BackColor = p.BackColor == Color.Green ? Color.Red : Color.Green;
}

他のいくつかのポイント。

  • 初期の背景色を設定しないため、クリックして緑に設定するまでデフォルトの色になります (緑はデフォルトの背景色ではないため)。
  • リスト インデックス + 1 を使用してピクチャ ボックスに名前を付ける理由 List インデックスと 0: からの自然な C# 反復を使用しないのはなぜfor (int i = 0; i < 24; i++)ですか?
于 2013-03-19T22:30:50.597 に答える
0

概説した方法は機能しませんがsender、イベント ハンドラーに渡されたオブジェクトを使用して同じことを行う別の方法があります。

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 1; i <= 24; i++)
    {
        PictureBox p = new PictureBox();
        p.Name = "pictureBox" + i;
        p.Click += PictureBox_Click;
    }
}

void PictureBox_Click(object sender, EventArgs e)
{
    PictureBox event_picturebox = (PictureBox)sender;
    event_picturebox.BackColor = Color.White;
}

このイベントを実行するすべての画像ボックスを同じイベントにマップするだけで、参照が渡されたため、イベントはこの画像ボックスに対してアクションを実行できるようになります。

フォームですでにピクチャ ボックスが定義されている場合は、次のようにするだけです。

private void Form1_Load(object sender, EventArgs e)
{
    pictureBox1.Click += PictureBox_Click;
    pictureBox2.Click += PictureBox_Click;
    // and keep going

    // OR
    // this is a bit dangerous if you don't want ALL 
    // your picture boxes to have this event
    // also assumes that you know picturebox1 exists.
    foreach (object f in this.Controls)
    {
        if (f.GetType().Equals(pictureBox1.GetType()))
        {
            ((PictureBox)f).Click += button_Click;
        }
    }
}
于 2013-03-19T21:50:16.183 に答える