2017-02-12 21 views
-1

Я создаю новые ящики изображений и их обработчики событий кликов программным способом. Но я не могу использовать их отдельно, потому что я не могу назвать их должным образом. Мне нужно назвать обработчики событий, например box1_click, box2_click ...C# - Как я могу назвать новый обработчик события с суффиксом числа, используя переменную?

Каков самый простой способ назвать новых обработчиков событий, отдельно пронумерованных целым числом?

Моя попытка:

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

Возможно, это помогает (дублировать?) Http://stackoverflow.com/questions/1389543/c-sharp-anonymous-functions-and-event-handlers –

+0

Будут ли ваши разные обработчики событий shar e такое же поведение на разных PictureBox? В этом случае один обработчик события может поместиться, в котором вы получите соответствующий PictureBox с: * PictureBox ThePictureBox = (PictureBox) Sender *. – Graffito

ответ

0

Существует несколько способов сделать это.

Вы можете либо добавить обработчик события как лямбда-выражение, который вызывает каждый конкретный обработчик отражение, как это (убедитесь, чтобы определить обработчик, как публичные методы):

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 
    } 
} 
+0

Спасибо! Получение имени щелкнутого изображения позволило решить мою проблему. Теперь я могу использовать все поля для отдельных задач. (Я использовал последний вариант.) – redo

1

Вы всегда должны использовать один и тот же обработчик события. Внутри обработчика вы должны определиться с параметром отправителя, что нужно сделать.

+0

Итак, как я могу определить, на каком ящике изображений я нажал? Есть ли пример? – redo