我有一个for loop
,它在一个按钮点击处理程序中为一组标签(连接组件标记算法)编号和颜色,如何在执行任何步骤后使循环暂停,并在循环中的相同位置重放再次点击按钮后?
下面是我的代码:
private void Button1_Click(object sender, EventArgs e)
{
int counter = 1;
for (int i = 1; i < 161; i++)
{
try
{
if (i == 1 && labelss[i].Text == "")
{
labelss[i].Text = "1";
}
if (labelss[i].Text == "0")
{
//do nothing
}
else //if the label is not 0
{
if (labelss[i - 1].Text !="0")
{
labelss[i].Text = labelss[i-1].Text;
}
else //if (labelss[i-1].Text=="0")
{
if (i > 20)
{
if (labelss[i - 20].Text != "0")
{
labelss[i].Text = labelss[i - 20].Text;
}
else
{
counter++;
labelss[i].Text = counter.ToString();
}
}
else if(i < 20)
{
counter++;
labelss[i].Text = counter.ToString();
}
}
}
}
catch
{
}
}
}
答案 0 :(得分:3)
您需要做的是将算法抽象到一个独立于按钮单击的单独类中。然后,这可以保持状态(例如,它改变了颜色的标签数量)。您需要传递类似First column:
-------------
A/T = 2/5
T/T = 1/5
A/A = 2/5
Second column:
-------------
C/C = 1/5
C/G = 4/5
Third column:
-------------
G/G = 1/5
C/C = 1/5
C/G = 3/5
的内容,可以在每次迭代时调用,并返回Func<int, bool>
或true
,具体取决于您是否要停止。
false
答案 1 :(得分:1)
你需要两件事
一种存储&#34;当前索引的方法&#34;点击之间。
在这个例子中,我使用Session。
// Process one label only.
public void ProcessLabel(int i)
{
// ... body of for loop ...
}
// Store current index between clicks.
private int CurrentIndex
{
get { return (int)Session["MyCurrentIndex"]; }
set { Session["MyCurrentIndex"] = value; }
}
// Processes one label, per click.
private void Button1_Click(object sender, EventArgs e)
{
int i = CurrentIndex;
if (i >= 161)
return; // End of for loop
ProcessLabel(i);
// On next click, CurrentIndex+1 will be processed.
CurrentIndex = i + 1;
}
// Call this function during page initialisation.
private void OnInit()
{
// Setup the first click.
CurrentIndex = 1;
}
答案 2 :(得分:-1)
我相信使用Yield关键字会做的事情:) ..