2015-11-03 570 views
0

我有一个for loop,它在按钮点击处理程序中对一组标记(连接组件标记算法)进行编号和着色,如何使循环在执行任何步骤后暂停并在点击按钮后在循环中的相同位置重放再次?下面 是我的代码:如何暂停for循环,然后在同一位置重新启动?

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

提示:全球布尔变量,变量保存位置,而循环/条件检查布尔变量.... – TheLethalCoder

+1

在一个侧面没有'如果这...做nothing'这是否真的需要仍然在代码中?正好反过来if语句,即'if(labelss [i] .Text!=“0”)' – TheLethalCoder

+1

你还想什么时候该循环暂停,在什么条件下...... – TheLethalCoder

回答

3

你需要做的是抽象的算法进行中独立于按钮点击的独立课程。这可以保持状态(例如它改变了多少个标签的颜色)。你需要传递一个类似于Func<int, bool>的东西,这可以称为每次迭代,并返回truefalse,具体取决于您是否希望它停止。

class Colourizer 
{ 

    private int _current; 

    public void Colourize(Func<int, bool> predicate) 
    { 
     for(int i = _current; _current < 161; ++ _current) 
     { 
      // change labels here 
      if(predicate(i)) 
       break; 
     } 
    } 

    public void Reset() 
    { 
     _current = 0; 
    } 
} 

private Colourizer _colourizer = new Colourizer(); 
private void Button1_OnClick(object sender, EventArgs args) 
{ 
    _colourizer.Colourize((i) => false); // this just does all 
} 
+0

亲爱的@Moo_Juice谢谢,我没有真正检查你的方式,看看它是如何工作的,但我利用了你的循环的声明,并改变了我的'for(int i = 1; i <161 ; i ++)'to'int iter = 1:for(int i = iter; i <161; i ++)',并在每次标记后使用'break'打开循环,并将循环的位置保存在变量“iter”中断。它现在工作完美,非常感谢你:) – Hakar

1

你需要两样东西

  • for循环作为一个单独的功能,走的是“当前索引”作为参数。
  • 在点击之间存储“当前索引”的方法。
    在这个例子中,我使用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; 
    } 
    
相关问题