2013-04-30 3 views
0

Я ищу метод для рекурсивного вызова события. У меня есть следующиеРекурсивно вызывать событие C#

private void btn_choose_Click(object sender, EventArgs e) 
{ 
    // switch statement to take the user input and decide the outcome. 
    switch (Convert.ToInt32(nud_cat_chooser.Value)) 
    { 
     case 1: 
      if (Convert.ToInt32(lbl_p1_cat_1_value.Text) == Convert.ToInt32(lbl_p2_cat_1_value.Text)) 
      { 
       MessageBox.Show("Stalemate");//message box to inform the user of a statemate. 
       playingcards card1 = player1.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       playingcards card2 = player2.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       assign_Values(); 
       btn_choose_Click(); 
      } 
     .... 
    } 
} 

Я хочу, чтобы вызвать btn_choose_click события в очередной раз разобраться в тупиковой ситуации. Знакам присваиваются значения из метода присваивания. Но я пытаюсь выполнить вызов для btn_choose_click(); Какие аргументы я должен пройти? Может ли кто-нибудь показать мне пример?

Спасибо :)

+1

btn_choose_Click (sender, e); –

+1

Noooooooooo. Переместите эту партию в другой класс. Сделайте первый вызов из обработчика событий. Что касается рекурсии, вам нужно условие выхода, или у вас закончится стека. Это далеко не ясно, что у вас. –

+0

@TonyHopkinson это хвост рекурсивный (по крайней мере, из этого фрагмента), поэтому проблем с стеком не будет. –

ответ

5

Пропустить отправителя и e.

Однако, если бы я был вами, я бы просто вытащил логику из вашего обработчика и применил его к методу. Совершенно плохая практика - явно вызвать обработчик. Обработчик события должен реагировать на событие. Если бы вы поставили точку останова в своем обработчике, вы ожидаете, что ее ударят только при отладке в ответ на событие в дескрипторах, а не потому, что это вызвал какой-то другой метод в другом месте вашего класса. Например:

private void btn_choose_Click(object sender, EventArgs e) 
{ 
    NewMethod(); 
} 
private void NewMethod() 
{ 
    switch (Convert.ToInt32(nud_cat_chooser.Value)) 
    { 


     case 1: 
      if (Convert.ToInt32(lbl_p1_cat_1_value.Text) == Convert.ToInt32(lbl_p2_cat_1_value.Text)) 
      { 
       MessageBox.Show("Stalemate");//message box to inform the user of a statemate. 
       playingcards card1 = player1.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       playingcards card2 = player2.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       assign_Values(); 
       NewMethod(); 


} 
+0

О, да, я никогда не могу извлечь его из нового метода, спасибо. – Yop

+2

+1 Я хочу, чтобы Microsoft никогда не придумывала целую '(отправитель, e)' вещь в первую очередь. Я никогда не использовал 'sender' для чего-либо, и я никогда не использую аспект' EventArgs' 'e'. Если 'EventHandler' был просто' Action 'или' Action' вместо этого, таких ситуаций можно было бы избежать. –

3

Вы можете просто позвонить Button.PerformClick(). Я не знаю названия вашей кнопки. Это запустит ваш метод.

См. Также Button.PerformClick() метод в MSDN.

Этот метод можно вызвать, чтобы поднять событие Click.

0

Просто используйте:

btn_choose_Click(null, null); 

Пока вы не полагаетесь на парах отправителя в вашем методе. Вы даже можете извлечь функцию из своего кода и вызвать ее в событии onClick.

1

В этом случае вы можете просто позвонить в

btn_choose_Click(this, new EventArgs()); 

Но будьте очень осторожны, отправитель должен быть использован для определения, какая кнопка вызова события ... Теперь, когда вы нарушаете его, вы должны напишите правильную документацию, чтобы не полагаться на параметр отправителя и eventargs внутри события.

Также вы можете думать о записи нового метода и назвав его с помощью цикла ... Это было бы более читаемым и надежным ..

+0

Хорошо, спасибо, я только что прочитал это в другом месте в Интернете. Я не знаю, что такое отправитель. Не могли бы вы объяснить это? – Yop

+1

@king 'EventArgs.Empty' будет лучше, чем выделение нового. –

+1

Отправитель - это представление объекта Button, которое инициирует это событие ... Вы можете получить доступ к кнопке внутри события, например ... (Кнопка) отправителя ... Это может помочь, когда две или три кнопки вызывают одно и то же событие. –

0

Вы можете создать отдельный метод из приведенной выше коды. Вы можете позвонить им из событий и где хотите.

2

Вы попадаете в рекурсивную страну, проявите большую осторожность!
Не вызывайте метод напрямую. Это плохой дизайн. Создайте другую функцию и убедитесь, что это рекурсивная функция.

private void btn_choose_Click(object sender, EventArgs e) 
{ 
    int action = Convert.ToInt32(nud_cat_chooser.Value); 
    this.DequeuePlayer(action); 
} 

/// <summary> 
/// Recursivly called until there is no more cards 
/// </summary> 
private void DequeuePlayer(int action) 
{ 
    // switch statement to take the user input and decide the outcome. 
    switch (action) 
    { 
     case 1: 
      if (Convert.ToInt32(lbl_p1_cat_1_value.Text) == Convert.ToInt32(lbl_p2_cat_1_value.Text)) 
      { 
       MessageBox.Show("Stalemate");//message box to inform the user of a statemate. 
       playingcards card1 = player1.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       playingcards card2 = player2.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       assign_Values(); 
       this.DequeuePlayer(action); 
      } 
     .... 
    } 
  • Извлечение данных из пользовательского интерфейса перед вызовом функции. Разделите слой вашей логики
  • Не запускайте MessageBox.Show в середине нигде
  • Проверьте значение свойства Текст текстового поля. Пользователь может поместить что-нибудь в это.
+1

+1 Хорошая точка. , – 2013-04-30 13:42:45

+0

Спасибо за совет. Теперь я создал отдельную функцию. В настоящий момент окно сообщения является просто заполнителем. Я решаю, что я собираюсь сделать, чтобы сообщить пользователю и о ценности нудизма. Его число вверх и вниз с верхним и нижним пределом с int индексом моего массива :) – Yop

1

Я сделал бы это в замкнутом цикле. Сделать его рекурсивным без необходимости просто делает код более запутанным.

private void btn_choose_Click(object sender, EventArgs e) 
{ 
    var continuing= true; 
    while (continuing) 
    { 
    // switch statement to take the user input and decide the outcome. 
    switch (Convert.ToInt32(nud_cat_chooser.Value)) 
    { 
     case 1: 
      if (Convert.ToInt32(lbl_p1_cat_1_value.Text) == Convert.ToInt32(lbl_p2_cat_1_value.Text)) 
      { 
       MessageBox.Show("Stalemate");//message box to inform the user of a statemate. 
       playingcards card1 = player1.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       playingcards card2 = player2.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards 
       assign_Values(); 
      } 
     .... 
     case end state: 
      do something 
      continuing= false; 
    } 
    } 
} 
Смежные вопросы