C# - 如何使用变量命名带有数字后缀的新事件处理程序?
C# - How can I name a new event handler with number suffix using a variable?
我正在以编程方式创建新的图片框及其点击事件处理程序。但我不能单独使用它们,因为我无法正确命名它们。我需要将事件处理程序命名为 box1_click、box2_click...
用整数单独编号的新事件处理程序的最简单命名方法是什么?
我的尝试:
for(i=1; i<11; i++)
{
boxes[i] = new PictureBox();
boxes[i].Name = "box" + i;
boxes[i].Click += new EventHandler( ??? );
}
您应该始终使用相同的事件处理程序。在处理程序中,您将根据发送者参数决定必须做什么。
有多种方法可以做到这一点。
您可以将事件处理程序添加为通过反射调用每个特定处理程序的 lambda 表达式(确保将您的处理程序定义为 public 方法):
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...
可能最好的选择是为所有 PictureBox 定义一个处理程序并将发送者对象转换为单击的 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
}
}
我正在以编程方式创建新的图片框及其点击事件处理程序。但我不能单独使用它们,因为我无法正确命名它们。我需要将事件处理程序命名为 box1_click、box2_click...
用整数单独编号的新事件处理程序的最简单命名方法是什么?
我的尝试:
for(i=1; i<11; i++)
{
boxes[i] = new PictureBox();
boxes[i].Name = "box" + i;
boxes[i].Click += new EventHandler( ??? );
}
您应该始终使用相同的事件处理程序。在处理程序中,您将根据发送者参数决定必须做什么。
有多种方法可以做到这一点。
您可以将事件处理程序添加为通过反射调用每个特定处理程序的 lambda 表达式(确保将您的处理程序定义为 public 方法):
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...
可能最好的选择是为所有 PictureBox 定义一个处理程序并将发送者对象转换为单击的 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
}
}