c#从单独的类/方法中跳出循环

本文关键字:方法 跳出循环 单独 | 更新日期: 2023-09-27 18:10:21

我有一个使用"for"循环重复的代码块,每个循环构造一个表单来显示一些文本。类似下面的简写代码。

Main()
{
For (int x: x<=20; x++)
{
createform(string[x]);
}
}

因此,对于每个循环,将一个不同的字符串传递给一个方法,该方法将构造如下所示的表单。

createform void (string input_)
{
...
code to build form and add a button "cancelbutton"
form.text = intput_
.... 
form.cancelbutton.Click += // and I want this to cause the original loop to end.... 
}

不,我知道我可以使用按钮使int x大于20,这将结束循环,但我实际上不知道最大值将是多少,因为这是动态的。同样,我可以解决这个问题,并做同样的事情,但它似乎有点"混乱"。

是否有一个更整洁的方法来导致按钮点击退出循环。如果Createform方法与main方法在一个单独的类中,会有什么不同吗?

c#从单独的类/方法中跳出循环

如果循环从0运行到20(甚至超过9000),用户将无法及时单击取消按钮。事实上,因为它都在一个线程上,循环将在UI响应点击之前完成,但也许我误解了。你能不能只设置一个布尔标志,在每次进入循环时进行检查,并在用户点击按钮时将其设置为false ?

只需添加一个变量并为click事件编码:

static bool clicked;
Main()
{
clicked = false;
For (int x: (x<=20) && !clicked; x++)
{
createform(string[x]);
}
}
public static void Click_Detector(object sender, EventArgs e) {
  clicked = true;
}

你的例程需要做这样的事情:

createform void (string input_)
{
...
code to build form and add a button "cancelbutton"
form.text = intput_
.... 
form.cancelbutton.Click += MainClass.Click_Detector;
}

您不应该使用循环来创建每个表单。假设您有一个提交按钮。每次用户单击submit时,都应该显式地显示下一个表单。这样,如果用户单击取消,您就不必担心其余的表单。

我想到的第一个解决方案是:方法的返回值True/False,并在foreach检查其返回值,如果False=>断开

您的psuedo代码没有指示您如何在CreateForm()中显示表单。这是情态动词还是非情态动词?它必须是模态的,否则,你只能一直创建表单,直到奶牛回家。请记住,在click按钮被单击之前,向click按钮添加处理程序实际上并不执行处理程序方法。

假设您的单击事件处理程序可以将x的值设置为大于20,但由于您说您不确定最大值是多少,您可以有一个由布尔标志控制的do循环,并且您的createform()可以设置标志的状态。

我建议重新考虑您的问题空间,因为这种总体方法看起来确实令人费解。我不理解你的UI,但看起来你的意图是让用户控制无限循环的退出,就像那些老的rpg问你"你想去冒险吗?是/否",它会继续问你,直到你点击"是"。

为类添加一个布尔值,并让click事件设置布尔值。然后你就可以跳出这个循环。然而,如果你在现实世界中使用的是上面的问题,我同意mikerobi给出的答案。

一个好的解决方案是使用BackgroundWorker类的CancelAsync()方法:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx

如果你不想用一个单独的线程来提高性能,我不建议,是设置一个类级别的布尔值,当按钮被点击,然后循环检查布尔值在每个下一个进程