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

Can we use parameter in mouse click event c#

我将循环用于二维按钮数组。我不知道如何准确知道数组中的哪些按钮被点击或未被点击

这是我的代码:

 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
       }

如果这个存在,怎么写才正确?或者你能推荐或方法来准确知道按钮在数组中的位置被点击吗?

如果您只对 Location 感兴趣,那这有什么问题呢? -

private void arrButton_Click(object sender, EventArgs e)
       {
         var button = sender as Button;
         //now use button.Location
       }

但是如果你想要更多的数据而不只是位置。这是一个例子

使用自定义按钮 class -

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.
    }
}

然后使用这个按钮class -

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
   }

顺便说一句,您不能更改事件处理程序的默认签名,如果您想要,您必须实现自己的 event/delegate。

您不能更改 EventHandler 签名以包含您的 ij

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

要获取该位置,您可以使用 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 声明,这是多余的。

试试这个

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;
 }