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()的调用;我必须传递什么参数?谁能给我举个例子?
谢谢:)
传递发送者和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事件中调用它。