0

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

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() 的调用;我必须通过什么论据?谁能给我一个例子?

谢谢 :)

4

7 回答 7

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();


}
于 2013-04-30T13:38:51.437 回答
3

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

另请参阅MSDN 上的Button.PerformClick()方法。

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

于 2013-04-30T13:36:00.837 回答
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);
            }
        ....
    }
  • 在调用函数之前从 UI 中提取数据。分离逻辑层
  • 不要在不知名的地方启动 MessageBox.Show
  • 测试文本框的属性 Text 的值。用户可以在里面放任何东西。
于 2013-04-30T13:41:50.230 回答
1

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

btn_choose_Click(this, new EventArgs());

但是要非常小心,sender 是用来识别哪个按钮正在调用事件的......既然你违反了它,你必须编写适当的文档来提及不要依赖事件内部的 sender 和 eventargs 参数。

您也可以考虑编写一个新方法并使用循环调用它......这将更具可读性和可靠性..

于 2013-04-30T13:36:48.863 回答
1

我会在一个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;
    }
  }
}
于 2013-04-30T13:52:40.270 回答
0

只需使用:

btn_choose_Click(null, null);

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

于 2013-04-30T13:36:19.110 回答
0

您可以从上面的代码创建单独的方法。你可以从事件和任何你想要的地方打电话给他们。

于 2013-04-30T13:37:51.860 回答