There are multiple ways to do that.
You could either add the event handler as a lambda expression that calls each specific handler by reflection like this (make sure to define your handlers as public methods):
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...
Another option is to create a delegate event handler using Delegate.CreateDelegate instead of a lambda expression like this:
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...
Probably the best option is to define one handler for all PictureBoxes and cast sender object as the clicked PictureBox like this:
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
}
}