我将循环用于二维数组按钮。我不知道如何确切地知道阵列中的哪些按钮被点击了
以下是我的代码:
for (int i = 0; i < 100 ; i++)
{
for (int j=0 ; j< 100; i++)
{
arrButton[i, j] = new Button();
arrButton[i,j].Size = new Size(size1button, size1button);
arrButton[i,j].Location = new Point(j*size1button, i*size1button);
arrButton.Click += new EventHandler(arrButton_Click);
}
}
我可以将参数i,j用于鼠标点击事件,例如:
private void arrButton_Click(object sender, EventArgs e, int i, int j)
{
//my idea : add i, j to another int[,] array to keep track of buttons which were clicked
}
如果退出,如何正确写入?或者您可以推荐或方法确切地知道在数组中单击按钮的位置吗?
答案 0 :(得分:0)
如果您只对Location
感兴趣,那么这有什么问题吗? -
private void arrButton_Click(object sender, EventArgs e)
{
var button = sender as Button;
//now use button.Location
}
但是如果你想要更多的数据而不仅仅是位置。这是一个例子
使用自定义按钮类 -
public class CustomButton<T> : Button {
public T Data{get;set;}
public CustomButton(T data){
this.Data = data; //i didn't compile it, so data type might mismatch.
}
}
然后使用此按钮类 -
for (int i = 0; i < 100 ; i++)
{
for (int j=0 ; j< 100; i++)
{
arrButton[i, j] = new CustomButton<T> (...some data);
arrButton[i,j].Size = new Size(size1button, size1button);
arrButton[i,j].Location = new Point(j*size1button, i*size1button);
arrButton.Click += new EventHandler(arrButton_Click);
}
}
在事件处理程序Cast
到CustomButton
并且瞧,有你的位置 -
private void arrButton_Click(object sender, EventArgs e)
{
var cButton = sender as CustomButton<T>;
// cButton.Datais your point. Have fun
}
顺便说一句,如果您希望必须实现自己的事件/委托,则无法更改事件处理程序的默认签名。
答案 1 :(得分:0)
您无法更改EventHandler签名以包含i
和j
。
但是,您可以从已传递给arrButton_Click
方法的内容中获取该信息。由于您将每个按钮的位置设置为new Point(j*size1button, i*size1button)
,因此您可以通过将按钮的位置除以i
来获取每个j
和size1button
组件。
要获取该位置,您可以使用sender
,即Button
(需要演员):
private void arrButton_Click(object sender, EventArgs e)
{
Button btnClicked = (Button) sender;
int i = btnClicked.Location.Y / size1button;
int j = btnClicked.Location.X / size1button;
}
此外,您当前用于创建按钮的代码有几个错误。
首先,你永远不会递增j
;第二个循环i++
。
其次,如果您希望显示按钮,则必须将它们添加到表单Controls
中。
最后,我不认为您的表单上有10 000个活动按钮,请尝试较低的数字,例如25。
因此修正后的代码如下:
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
arrButton[i, j] = new Button();
arrButton[i, j].Size = new Size(size1button, size1button);
arrButton[i, j].Location = new Point(j*size1button, i*size1button);
arrButton[i, j].Click += arrButton_Click;
Controls.Add(arrButton[i,j]);
}
}
您还可以注意到我删除了new EventHandler
的声明,这是多余的。
答案 2 :(得分:0)
试试这个
public class Indeces
{
public int IndexI { get; set; }
public int IndexJ { get; set; }
}
现在循环设置标记
for (int i = 0; i < 100 ; i++)
{
for (int j=0 ; j< 100; i++)
{
arrButton[i, j] = new Button();
arrButton[i,j].Size = new Size(size1button, size1button);
arrButton[i,j].Location = new Point(j*size1button, i*size1button);
arrButton.Click += new EventHandler(arrButton_Click);
arrButton.Tag = new Indeces {IndexI = i,IndexJ = j};
}
}
从此处获取值
private void arrButton_Click(object sender, EventArgs e)
{
var button = sender as Button;
var indeces = (Indeces) button.Tag;//get indeces here
var i = indeces.IndexI;
var j = indeces.IndexJ;
}