我们可以在鼠标点击事件中使用参数c#

时间:2015-07-23 03:56:00

标签: c# events parameters click mouse

我将循环用于二维数组按钮。我不知道如何确切地知道阵列中的哪些按钮被点击了

以下是我的代码:

 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
       }

如果退出,如何正确写入?或者您可以推荐或方法确切地知道在数组中单击按钮的位置吗?

3 个答案:

答案 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);
        }
    }

在事件处理程序CastCustomButton并且瞧,有你的位置 -

private void arrButton_Click(object sender, EventArgs e)
   {
       var cButton = sender as CustomButton<T>;
       // cButton.Datais your point. Have fun
   }

顺便说一句,如果您希望必须实现自己的事件/委托,则无法更改事件处理程序的默认签名。

答案 1 :(得分:0)

您无法更改EventHandler签名以包含ij

但是,您可以从已传递给arrButton_Click方法的内容中获取该信息。由于您将每个按钮的位置设置为new Point(j*size1button, i*size1button),因此您可以通过将按钮的位置除以i来获取每个jsize1button组件。

要获取该位置,您可以使用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;
 }