2014-01-18 49 views
0

爲什麼這個簡單的代碼導致休眠錯誤:簡單的開關導致堆棧溢出

無法計算表達式,因爲當前線程處於堆棧溢出狀態。

private void barButtonPanelVisibleCheck_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e) 
{ 
    switch (barButtonPanelVisibleCheck.Checked) 
    { 
     case true: 
      this.navBarControl.Visible = false; 
      this.barButtonPanelVisibleCheck.Checked = false; 
      break; 
     case false: 
      this.navBarControl.Visible = true; 
      this.barButtonPanelVisibleCheck.Checked = true; 
      break; 
    } 

    //or 

    if (barButtonPanelVisibleCheck.Checked == true) 
    { 
     this.navBarControl.Visible = false; 
     this.barButtonPanelVisibleCheck.Checked = false; 
    } 
    else 
    { 
     this.navBarControl.Visible = true; 
     this.barButtonPanelVisibleCheck.Checked = true; 
    } 

} 
+0

爲什麼你要改變複選框的狀態呢?憑藉用戶點擊複選框,其狀態已被修改。只要刪除這些線。 – Yuck

回答

2

由於您在CheckedChanged事件中嘗試更改複選框的選中狀態,因此會引發另一個CheckedChanged事件,並且這會啓動無限循環,從而消耗堆棧內存,直到達到StackOverflow異常。

嘗試與

private void barButtonPanelVisibleCheck_CheckedChanged(object sender, 
          DevExpress.XtraBars.ItemClickEventArgs e) 
{ 
     try 
     { 

      this.barButtonPanelVisibleCheck.CheckedChanged -= 
       barButtonPanelVisibleCheck_CheckedChanged; 

      ... do your checked changed here 

     } 
     finally 
     { 
      this.barButtonPanelVisibleCheck.CheckedChanged += 
       barButtonPanelVisibleCheck_CheckedChanged; 
     } 
} 

斷開事件處理函數允許改變的選中狀態,而不再入事件處理程序,在此之後,重新連接的情況下停止對你的CheckedChanged事件遞歸。可能對於這種情況,沒有必要使用try/finally,但使用finally將確保事件始終重新連接,以防您的代碼因異常而失敗。

0

當檢查控制狀態改變時,方法barButtonPanelVisibleCheck_CheckedChanged被調用。在該方法中,您更改該控件的Checked屬性,這會導致調用方法barButtonPanelVisibleCheck_CheckedChanged。在該方法中,您可以更改該控件的Checked屬性。

3

您正在更改Checked處理程序中的Checked:Checked值已設置,因此處理程序被調用,它設置Checked值等,並且您有一個無限循環。