Существует несколько способов сделать это.
Вы можете либо добавить обработчик события как лямбда-выражение, который вызывает каждый конкретный обработчик отражение, как это (убедитесь, чтобы определить обработчик, как публичные методы):
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 вместо лямбда-выражения, как это:
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 и объекта литая отправителя, как щелкнул 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
}
}
Возможно, это помогает (дублировать?) Http://stackoverflow.com/questions/1389543/c-sharp-anonymous-functions-and-event-handlers –
Будут ли ваши разные обработчики событий shar e такое же поведение на разных PictureBox? В этом случае один обработчик события может поместиться, в котором вы получите соответствующий PictureBox с: * PictureBox ThePictureBox = (PictureBox) Sender *. – Graffito