2

だから私のプログラムでは、ボタンと数値を持つ構造体を作成しました...このように

struct box
    {
        public int numberValue;
        public Button button;
    }

次に、この構造体の 2D 配列を作成しました

box[,] boxes = new box[20, 20];

今私がしたことは、400個のボタンを作成し、それらを配列の各インデックスに割り当てたことです...このように

        private void createBoxes()
    {
        int positionX;
        int positionY;
        for (int i = 0; i < 20; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                positionX = 20 + (25 * i);
                positionY = 20 + (25 * j);
                boxes[i, j].button = new System.Windows.Forms.Button();
                boxes[i, j].button.Location = new System.Drawing.Point(positionX,positionY);
                boxes[i, j].button.Size = new System.Drawing.Size(25, 25);
                this.Controls.Add(boxes[i, j].button);
                boxes[i, j].button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
                boxes[i, j].button.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
                boxes[i, j].button.Visible = true;
                boxes[i, j].button.Name = "button";
                boxes[i, j].button.Click += new EventHandler(buttonClick);
            }
        }
    }

今、イベント ハンドラを作成するときに、「boxes[i,j].button」だけでなく「boxes[i,j]」を送信したいのですが、これを行う方法はありますか?

4

3 に答える 3

4

独自の匿名イベント ハンドラーを定義する以外に、必要なことを行う簡単な方法があります。

boxes[i, j].button.Tag = boxes[i, j];

じゃあ後で:

private void buttonClick(object sender, EventArgs e)
{
    var box = ((Button)sender).Tag as box;
}
于 2011-04-27T01:10:35.297 に答える
3

これは、匿名イベント ハンドラーを介して解決できます。

var box = boxes[i, j]; // You must use a new variable within this scope
box.button.Click += (obj, args) => buttonClick(box, args);

これは、コードを最小限に抑えた最も迅速なソリューションです。匿名のイベント ハンドラーは隠れた落とし穴で有名であり、新しいボックス変数を割り当てる必要があることはその一例です。次のコードは実行されますが、どのボタンを押しても、最後に割り当てられたijの値がハンドラー内で使用されます。

boxes[i,j].button.Click += (obj, args) => buttonClick(boxes[i,j], args);
于 2011-04-27T01:08:58.357 に答える
0

いいえ、これは不可能です。個々のボタン コントロールは、イベントを発生させるものであり、senderパラメータによって参照されるオブジェクトです。ボタン コントロールを含む配列は無関係です。

この動作は仕様です。ユーザーがクリックしたことに応じてボタンのプロパティを変更したい場合、個々のボタンがクリックされたことがわからない限り、変更することはできません。すべてのボタンを含む配列への参照だけでは、クリックされた個々のボタンに関する十分な情報が得られません。

于 2011-04-27T01:11:43.050 に答える