EventHandlers和发件人

时间:2011-04-27 01:04:26

标签: c# events handler event-handling sender

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

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]”而不仅仅是“box [i,j] .button”还是要进行此操作吗?

3 个答案:

答案 0 :(得分:4)

如果没有定义自己的匿名事件处理程序,可以通过简单的方法来执行您想要的操作:

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

然后:

private void buttonClick(object sender, EventArgs e)
{
    var box = ((Button)sender).Tag as box;
}

答案 1 :(得分:3)

这可以通过匿名事件处理程序解决。

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

这是代码最少的最快解决方案。请注意,匿名事件处理程序因隐藏的陷阱而臭名昭着,并且需要分配新的 box 变量就是一个例子。将运行以下代码,但无论您按哪个按钮,都会在处理程序中使用 i j 的最后分配值。

boxes[i,j].button.Click += (obj, args) => buttonClick(boxes[i,j], args);

答案 2 :(得分:0)

不,这是不可能的。单个按钮控件是引发事件的控件,因此它是sender参数引用的对象。 包含按钮控件的数组无关紧要。

此行为是按设计进行的。如果您想要更改按钮的属性以响应用户点击它,除非您知道单击了哪个个别按钮,否则将无法执行此操作。仅包含对包含所有按钮的数组的引用将无法提供有关单击的单个按钮的足够信息。