2

所以在我的程序中,我创建了一个带有按钮和数值的结构......就像这样

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

然后我制作了这个结构的二维数组

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]”而不仅仅是“boxes[i,j].button”,无论如何要这样做吗?

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 回答