【问题标题】:C# - How can I name a new event handler with number suffix using a variable?C# - 如何使用变量命名带有数字后缀的新事件处理程序?
【发布时间】:2017-02-12 10:13:49
【问题描述】:

我正在以编程方式创建新的图片框及其点击事件处理程序。但我不能单独使用它们,因为我不能正确命名它们。我需要将事件处理程序命名为 box1_click、box2_click...

命名新事件处理程序的最简单方法是用整数分别编号吗?

我的尝试:

for(i=1; i<11; i++)
{
   boxes[i] = new PictureBox();
   boxes[i].Name = "box" + i;
   boxes[i].Click += new EventHandler( ??? );
}

【问题讨论】:

  • 也许这有帮助(重复?)stackoverflow.com/questions/1389543/…
  • 您的不同事件处理程序会在不同的 PictureBoxes 上共享相同的行为吗?在这种情况下,一个单独的事件处理程序可能适合您通过以下方式获取适当的 PictureBox:PictureBox ThePictureBox=(PictureBox)Sender

标签: c# events handler


【解决方案1】:

有多种方法可以做到这一点。

您可以将事件处理程序添加为 lambda 表达式,通过反射调用每个特定的处理程序,如下所示(确保将处理程序定义为公共方法):

MethodInfo method = this.GetType().GetMethod("B_Click" + i.ToString());
boxes[i].Click += (o,e) =>
{
    if (null != method)
    {
        method.Invoke(this, new object[2] { o, e });
    }
};

...

 public void B_Click1(object sender, EventArgs e)
 public void B_Click2(object sender, EventArgs e)
 etc...

另一种选择是使用 Delegate.CreateDelegate 创建委托事件处理程序,而不是像这样的 lambda 表达式:

MethodInfo method = this.GetType().GetMethod("B_Click" + i.ToString());
EventHandler handler = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), this, method);
boxes[i].Click += handler;

...

 public void B_Click1(object sender, EventArgs e)
 public void B_Click2(object sender, EventArgs e)
 etc...

可能最好的选择是为所有 PictureBoxes 定义一个处理程序,并将 sender 对象转换为单击的 PictureBox,如下所示:

boxes[i].Click += B_Click;

...

private void B_Click(object sender, EventArgs e)
{
    PictureBox clickedPictureBox = sender as PictureBox;
    if (clickedPictureBox != null)
    {
        string name = clickedPictureBox.Name; // for example get picture box name
    }
}

【讨论】:

  • 谢谢!!获取点击图片框的名称解决了我的问题。现在我可以将所有图片框用于单独的任务。 (我使用了最后一个选项。)
【解决方案2】:

您应该始终使用相同的事件处理程序。在处理程序中,您将决定发送者参数必须做什么。

【讨论】:

  • 那么我如何确定我点击了哪个图片框?有例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多