我有一个自定义按钮矩阵(我继承了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中?但我不知道该怎么做。
答案 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]);
}
}