C#从单独的类/方法中突破循环

时间:2011-10-04 16:18:40

标签: c# loops

我有一个代码块,使用“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在一个单独的类中,那会有什么不同吗?

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

只需添加一个变量并对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;

}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我想到的第一个解决方案是:返回方法True / False的值,并在foreach中检查其返回值,如果False =&gt;断裂。

答案 4 :(得分:1)

您的伪代码未指示您如何在CreateForm()中显示表单。这是模态还是非模态?它必须是模态的,否则,你只是继续创建形式,直到奶牛回家。请记住,在单击单击按钮之前,向单击按钮添加处理程序实际上不会执行处理程序方法。

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

我建议重新考虑你的问题空间,因为这种整体方法看起来真的很复杂。我不明白你的UI,但似乎你的意图是让用户控制无限循环的退出,就像那些问你“你想要冒险是/否”的旧RPG一样,它会继续问你,直到你点击“是”。这些都是毫无意义和令人困惑的。

答案 5 :(得分:1)

在类中添加一个布尔值,并将click事件设置为布尔值。然后你可以摆脱循环。但是,如果您的真实世界使用是上述问题,我会同意mikerobi给出的答案。

答案 6 :(得分:0)

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

如果您不想使用单独的线程来提高性能,我不建议,是在单击按钮时设置类级别的布尔值,然后for循环检查每个中的布尔值下一个过程。