c#中递归调用事件

本文关键字:事件 调用 递归 | 更新日期: 2023-09-27 18:11:43

我正在寻找递归调用事件的方法。我有以下

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事件来解决僵局。标签将从assign方法中获得值。但我正在努力实现对btn_choose_click()的调用;我必须传递什么参数?谁能给我举个例子?

谢谢:)

c#中递归调用事件

传递发送者和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();

}

您可以简单地调用Button.PerformClick()。我不知道你的纽扣的名字。这将触发你的方法。

请参见MSDN中的Button.PerformClick()方法。

可以调用此方法引发Click事件。

你将进入一个递归的世界,要非常小心!
不要直接调用该方法。这是一个糟糕的设计。创建一个不同的函数,并明确这是一个递归函数。

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);
            }
        ....
    }
  • 在调用函数之前从UI中提取数据。分隔逻辑层
  • 不要启动MessageBox。Show in middle of nowhere
  • 测试文本框的文本属性的值。用户可以在里面放任何东西

在这种情况下,您可以直接调用as

btn_choose_Click(this, new EventArgs());

但是要非常小心,sender将被用来识别哪个按钮正在调用事件…既然你违反了它,你就必须编写适当的文档来说明不要依赖事件中的sender和eventargs参数。

你也可以考虑写一个新方法,并使用循环调用它…这样会更容易读,更可靠。

我会在while循环中做这件事。不必要地递归只会让代码更加混乱。

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;
    }
  }
}

您可以从上面的代码中创建单独的方法。然后,您可以从事件和任何您需要的地方调用它们。

直接使用:

btn_choose_Click(null, null);

只要你不依赖于方法中的sender参数。您甚至可以从代码中提取一个函数并在onClick事件中调用它。