在c#中动态创建的按钮中使用其名称选择按钮

时间:2014-05-20 07:51:49

标签: c# winforms button

我正在动态创建按钮。如何从代码的剩余部分使用其名称(例如,在以下代码中使用“i”)选择特定按钮。

for(int i = 0; i < 5; i++)
{
    button b = new button();
    b.name = i.ToString();
}

4 个答案:

答案 0 :(得分:2)

首先 - 仅仅创建按钮还不够。您需要将它们添加到某个控件中:

for(int i = 0; i < 5; i++)
{
    Button button = new Button();
    button.Name = String.Format("button{0}", i); // use better names
    // subscribe to Click event otherwise button is useless
    button.Click = Button_Click;
    Controls.Add(button); // add to form's controls
}

现在,您可以搜索某些特定按钮的按钮容器的子控件:

var button = Controls.OfType<Button>().FirstOrDefault(b => b.Name == "button2");

注意:如果您将使用 buttonN 名称模式,请确保您没有其他具有相同名称的按钮,因为VS设计人员使用此模式。

更新:如果你将为所有动态按钮使用相同的事件处理程序Click事件(实际上你应该),那么即使在事件处理程序中你也可以轻松获得引发的按钮:

private void Button_Click(object sender, EventArgs e)
{
    // that's the button which was clicked
    Button button = (Button)sender;
    // use it
}

答案 1 :(得分:0)

更简单的解决方案是搜索Controls集合中的按钮。

Button btn = (Button) this.Controls["nameButton"];
//...DO Something

此解决方案的问题是,如果没有nameButton的按钮,JIT将抛出异常。如果你想阻止这个,你必须在try catch块中插入代码,或者,如果你愿意,你可以使用Sergey Berezovskiy解决方案(他使用Linq,我认为它更清楚)< / p>

答案 2 :(得分:0)

您必须 按钮

  for (int i = 0; i < 5; i++) {
    // Mind the case: Button, not button
    Button b = new Button();
    // // Mind the case: Name, not name
    b.Name = i.ToString();

    //TODO: place your buttons somewhere:
    // on a panel
    //   myPanel.Controls.Add(b);
    // on a form
    //   this.Controls.Add(b);
    // etc.

    //TODO: it seems, that you want to add Click event, something like
    //  b.Click += MyButtonClick;  
  }

然后您可以查询Controls的适当Button

  Button b = myPanel.Controls["1"] as Button;

  if (b != null) {
    // The Button is found ...
  } 

答案 3 :(得分:-1)

你可以把它们放在Button []中,或者你可以迭代你的Form的Controls集合。