如何知道按钮阵列中的哪个按钮被单击

时间:2019-07-14 15:15:56

标签: c# arrays button

我有一组按钮,按钮的长度是用户键入的变量。因此,我为所有按钮制作了一个eventHandler。但是我有一个问题,我需要知道单击了哪个Button,以便可以在eventHandler中执行我想要的操作。在我的代码中它更加复杂,但是我已经对其进行了总结。实际上,我只需要单击该按钮的索引即可。

    public Button[] btn;

    public void creatingButtons()
    {
        btn = new Button[x];
        for(int i=0; i<btn.Length; i++){
            Controls.Add(btn[i]);
            btn[i].Click += new EventHandler(btn_Click);
        }
    }

    private void btn_Click(object sender , EventArgs e)
    {
        int index;
        btn[index].Text = "This is clicked button";
    }

3 个答案:

答案 0 :(得分:1)

发件人是要单击的对象,因此您可以使用:

private void btn_Click(object sender , EventArgs e)
{
    Button clickedBut = sender as Button;
    clickedBut.Text = "This is clicked button";
}

答案 1 :(得分:1)

通过查看文档(通过谷歌搜索“ c#按钮单击”找到的第一个结果)

https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.button.-ctor?view=netframework-4.8

public Button[] btns;

public void createButtons(int count) {
  btns = new Button[count];
  for (int i=0; i<count; i++) {
    btns[i] = new Button()
    Controls.Add(btns[i]);
    btns[i].Click += new EventHandler(btn_Click);
  }
}

private void btn_Click(object sender, EventArgs e) {
  Button clickedButton = (Button)sender;
  int index = Array.IndexOf(btns, clickedButton);

  clickedButton.Text = "...button clicked...";

}

请注意,您可以将发送方强制转换为Button,并大概使用Array.IndexOf来查找索引。

答案 2 :(得分:0)

正如其他答案所指出的,您可以使用sender

但是更好的解决方案是为按钮添加其他点击处理程序。如果点击处理程序需要为每个按钮或一组按钮执行不同的操作,那么从技术上讲,它是一个不同的处理程序。在创建按钮的过程中,您知道按钮的用途,拥有按钮的实例,因此要做出决定并为其添加适当的处理程序。

通过这种方式,您的代码遵循OOP原则,可以将关注点很好地分离,而不是事后将一堆特别的if语句修补在一起。