0

の配列を初期化していますPictureBox。問題は、それぞれに個人EventHandlerを追加することはできません。forループにこのコードがあります:

picBoxs[i] = new PictureBox();
picBoxs[i].Anchor = AnchorStyles.None;
picBoxs[i].Location = new Point(x, y);
picBoxs[i].Size = new Size(104, 104);
picBoxs[i].SizeMode = PictureBoxSizeMode.Normal;
picBoxs[i].BorderStyle = BorderStyle.FixedSingle;
//this.picBoxs[i].Click += new System.EventHandler(this.picBoxs_Click); //Single EventHandler for all PictureBox(s)
this.picBoxs[i].Click += new System.EventHandler(this.picBoxs[i]_Click); //Generates error

picBoxs1_Click()picBoxs2_Click()picBoxs3_Click()...(など) が必要です。EventHandlerそれぞれが必要だからPictureBoxです。問題なく一般EventHandler化できますが、これを行うと、すべてのメソッドが取得され、別のをクリックした後に別のものを実行できません。どんなアイデアでも大歓迎です。picBox_Click()PictureBoxPictureBox

前もって感謝します...

編集: PictureBox をクリックすると、メッセージ ボックスが表示され、2D 配列のインデックスが表示されます。私のピクチャボックスが次のように配置されているとします:

picBox0 picBox1 picBox2

picBox3 picBox4 picBox5

picBox2 をクリックした後: MessageBox は "[0][2]" と表示され、picBox4 をクリックした場合と同じ: MessageBox は "[1][1]" と表示されます...

4

2 に答える 2

2

次のように、単一のイベント ハンドラーを使用します。

this.picBoxs[i].Click += picBoxs_Click;

そして、そのイベント ハンドラー内で、ピクチャ ボックスに関する情報を検索できます。

void picBoxs_Click(object sender, EventArgs e)
{
    var box = sender as PictureBox;
    int i = Array.IndexOf(picBoxs, box);

    int columnCount = 3;
    int row = i / columnCount;
    int col = i % columnCount;

    Messagebox.Show(string.Format("[{0}][{1}]", row, col));       
}
于 2012-11-29T19:25:02.227 に答える
1

ここで複雑になることなく、これはあなたにとって簡単な解決策です

まず、各ボックスのサイズでグローバルな const を宣言します

const int BOX_SIZE = 128;

次に、それらすべてのボックスを作成します

this.picBoxs[i].Click += new System.EventHandler(Boxes_Click);
picBoxs[i].Location = new Point(x*BOX_SIZE, y*BOX_SIZE);
picBoxs[i].Size = new Size(BOX_SIZE,BOX_SIZE);

最後にイベントハンドラ:

void Boxes_Click(object sender, EventArgs e)
{
    PictureBox theBox = sender as PictureBox;
    if(theBox != null)
    {

         MessageBox.Show("Box was clicked, x: {0} y:{1}", 
                         theBox.Location.X / BOX_SIZE, 
                         theBox.Location.Y / BOX_SIZE);
    } 
} 

これがうまくいかない場合は、PictureBox を派生するクラスを作成し、Coordinates という名前のプロパティを追加するか、ボックスの座標を格納する何かを追加します。

class MyPictureBox : PictureBox
{
    public Point Coordinates { get; set;}
}

それで:

int size_w = 128;
int size_h = 128;

...

MyPictureBox[] picBoxs = new MyPictureBox[1000];

...

picBoxs[i].Click += new System.EventHandler(Boxes_Click);
picBoxs[i].Coordinates = new Point(x,y);
picBoxs[i].Position = new Point(x * size_w, y*size_h);
picBoxs[i].Size = new Size(size_w, size_h);

...

void Boxes_Click(object sender, EventArgs e)
{
    MyPictureBox theBox = sender as MyPictureBox;
    if(theBox != null)
    {

     MessageBox.Show("Box was clicked, x: {0} y:{1}", 
                     theBox.Coordinates.X, 
                     theBox.Coordinates.Y);
    } 
} 
于 2012-11-29T18:38:44.563 に答える