C# 在运行时添加C按钮点击代码的数组

C# 在运行时添加C按钮点击代码的数组,c#,C#,要在运行时创建按钮及其单击事件,我使用: Button b = new Button(); b.Name = "btn1"; b.Click += btn1_Click; 但是现在我有一系列的按钮要在运行时创建;如何设置每个按钮的事件-我不能插值,因为它不是字符串 Button[] b = new Button(Count); for (int i=0; i < Count; i++) { b[i] = new Button(); b[i].Name = "btn" + i;

要在运行时创建按钮及其单击事件,我使用:

Button b = new Button();
b.Name = "btn1";
b.Click += btn1_Click;
但是现在我有一系列的按钮要在运行时创建;如何设置每个按钮的事件-我不能插值,因为它不是字符串

Button[] b = new Button(Count);
for (int i=0; i < Count; i++)
{
  b[i] = new Button();
  b[i].Name = "btn" + i;
  b[i].Click += ??????
}

我该怎么办?

您可以将所有按钮绑定到同一个事件,因此将行像b[I]一样放置。单击+=button\u-Click

然后在按钮单击事件中,您可以区分按钮,并采取适当的操作

例如:

public void button_Click(object sender, ButtonEventArgs e)
{
  if( sender == b[0] )
  {
    //do what is appropriate for the first button
  }
  ...
}

您可以将所有按钮绑定到同一个事件,因此请像b[i]那样放置行。单击+=按钮\u单击

然后在按钮单击事件中,您可以区分按钮,并采取适当的操作

例如:

public void button_Click(object sender, ButtonEventArgs e)
{
  if( sender == b[0] )
  {
    //do what is appropriate for the first button
  }
  ...
}
备选案文1:

您可以传递lambda函数,并根据数组中的按钮索引创建处理程序,如下所示:

for (int i=0; i < Count; i++)
{
   b[i] = new Button();
   b[i].Name = "btn" + i;
   b[i].Click += (sender, args) => 
   {
     // your code
   }
}
Button[] b = new Button[Count];

for (int i=0; i < Count; i++)
{
    b[i] = new Button();
    b[i].Name = "btn" + i;
    b[i].Click += (s, e) => { /*do something*/ };
}
备选案文3:

您可以指定处理程序函数:

b[i].Click += YourHandlerFunction
// ....

// The handler signature also has to have the correct signature
void YourHandlerFunction(object sender, ButtonEventArgs  args) 
{
    // your code
}
备选案文1:

您可以传递lambda函数,并根据数组中的按钮索引创建处理程序,如下所示:

for (int i=0; i < Count; i++)
{
   b[i] = new Button();
   b[i].Name = "btn" + i;
   b[i].Click += (sender, args) => 
   {
     // your code
   }
}
Button[] b = new Button[Count];

for (int i=0; i < Count; i++)
{
    b[i] = new Button();
    b[i].Name = "btn" + i;
    b[i].Click += (s, e) => { /*do something*/ };
}
备选案文3:

您可以指定处理程序函数:

b[i].Click += YourHandlerFunction
// ....

// The handler signature also has to have the correct signature
void YourHandlerFunction(object sender, ButtonEventArgs  args) 
{
    // your code
}

这取决于你想做什么!如果要为所有单击调用相同的方法,请执行以下操作:

Button[] b = new Button[Count];

for (int i=0; i < Count; i++)
{
    b[i] = new Button();
    b[i].Name = "btn" + i;
    b[i].Click += OnClick
}

private void OnClick(object sender, RoutedEventArgs e)
{
      // do something
} 
如果要对每个按钮执行不同的操作,例如,根据索引,可以执行以下操作:

for (int i=0; i < Count; i++)
{
   b[i] = new Button();
   b[i].Name = "btn" + i;
   b[i].Click += (sender, args) => 
   {
     // your code
   }
}
Button[] b = new Button[Count];

for (int i=0; i < Count; i++)
{
    b[i] = new Button();
    b[i].Name = "btn" + i;
    b[i].Click += (s, e) => { /*do something*/ };
}

这取决于你想做什么!如果要为所有单击调用相同的方法,请执行以下操作:

Button[] b = new Button[Count];

for (int i=0; i < Count; i++)
{
    b[i] = new Button();
    b[i].Name = "btn" + i;
    b[i].Click += OnClick
}

private void OnClick(object sender, RoutedEventArgs e)
{
      // do something
} 
如果要对每个按钮执行不同的操作,例如,根据索引,可以执行以下操作:

for (int i=0; i < Count; i++)
{
   b[i] = new Button();
   b[i].Name = "btn" + i;
   b[i].Click += (sender, args) => 
   {
     // your code
   }
}
Button[] b = new Button[Count];

for (int i=0; i < Count; i++)
{
    b[i] = new Button();
    b[i].Name = "btn" + i;
    b[i].Click += (s, e) => { /*do something*/ };
}

谢谢,我试过了,发现这是更好的答案。如果没有sender==b[o],并且我将数组放入lamda函数中,它将抛出一个异常,因为调用该数组时该数组为null。谢谢,我尝试了,发现这是更好的答案。如果没有sender==b[o],并且我将数组放入lamda函数中,它将抛出一个异常,因为调用该数组时该数组为null。