单击事件到自定义按钮

时间:2014-07-21 20:04:29

标签: c# winforms

我有一个自定义按钮矩阵(我继承了Button的FifteenButton类)。我希望矩阵中的每个按钮都有一个click事件,它调用一个可以完成某些工作的方法。但是我不想为矩​​阵中的每个按钮编写这样的方法。所以,我在initializeComponent中做了类似的事情:

for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
        fbarr[i, j].Click += new System.EventHandler(this.FifteenButton_Click);

并在FifteenButton_Click我想知道点击了哪个按钮(最好是i,j坐标)。

我应该怎样做这样的事情?也许在FifteenButton_Click的EventArgs中?但我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

Click事件的事件hadler接收两个参数

void FifteenButton_Click(object sender, EventArgs e)

sender参数是对单击按钮的引用,所以

void FifteenButton_Click(object sender, EventArgs e)
{
     Button btn = sender as Button;
     if(btn != null)
     {
          Console.WriteLine("Button clicked: " + btn.Text);
     }
}

但是,如果要检索问题中使用的数组中按钮的位置,则需要更多内容。例如,您可以使用Tag属性存储按钮的i j坐标。

for(int i = 0; i < 4; i++)
{
    for (int j = 0; j < 4; j++)
    {
        fbarr[i, j].Click += new System.EventHandler(this.FifteenButton_Click);
        fbarr[i, j].Tag = i.ToString() + "_" + j.ToString();
    }
}

现在,在事件处理程序中,您可以轻松读取按钮的Tag属性并恢复索引

void FifteenButton_Click(object sender, EventArgs e)
{
     Button btn = sender as Button;
     if(btn != null)
     {
          string[] xy = btn.Tag.ToString().Split('_');
          Console.WriteLine("Button clicked: " + xy[0] + "," + xy[1]);
     }
}