2014-01-31 68 views
0

感謝您的閱讀。無法處理和刪除控制列表中的控件

我有一個C#.NET窗體的按鈕,在主面板中切換控件。在升級到Visual Studio 2012和Advanced Installer之前,我沒有任何問題。目標框架是4.0,而不是4.5。

當我更改控件時,我在添加新控件之前先處理並刪除了前一個控件,但是當沒有任何控件(即第一個控件加載時)出現錯誤。

原始循環在修改集合時與某些迭代有關,所以現在我試圖在確保它在那裏後刪除一個控件。

此錯誤與:索引0超出範圍。

這一切都可以在開發機器上正常工作,這不是使用舊的內置VS安裝程序的問題。

任何想法? 4.0框架問題?遺漏引用未被部署?

謝謝!

panelMain.SuspendLayout(); 
int control_count = panelMain.Controls.Count; 
if (control_count > 1) { 
    Log.Write("More than one control found in main panel.", ErrorLevel.Error); 
} 
if (control_count > 0) { 
    Control current_ctrl = panelMain.Controls[0]; 
    current_ctrl.Dispose(); 
    panelMain.Controls.Remove(current_ctrl); 
} 

//foreach (Control ctrl in panelMain.Controls) { 
// ctrl.Dispose(); 
// panelMain.Controls.Remove(ctrl); 
//} 

回答

2

你已經註釋到的foreach循環的問題是你不能添加項目或從你正在枚舉的集合中刪除項目。這意味着如果你想遍歷一個集合並移除項目,那麼你必須使用for循環。如果你想刪除多個項目,那麼你必須向後循環。

第二個if語句的問題在於,處置控件會自動將其從其父控件集合中刪除。這意味着,只要您在控件上調用Dispose,Controls集合中就不再有一個項目,因此Remove調用失敗。

因此,故事的寓意是,您應該使用for循環,向後循環並使用Dispose來銷燬和刪除。

0

這是一個簡單的遞歸方法來處置控制,如果任何人有興趣。使用上面的jmcilhinney的建議。

注意:請務必閱讀關於Visible屬性的所有評論並將其設置爲true。

// Start by calling a parent control containing the controls you want to 
    // destroy such as a form, groupbox or panel 
    private void DisposeControls(Control ctrl) 
    { 
     // Make control disappear first to avoid seeing each child control 
     // disappear. This is optional (if you use - make sure you set parent 
     // control's Visible property back to true if you create controls 
     // again) 
     ctrl.Visible = false; 
     for (int i = ctrl.Controls.Count - 1; i >= 0; i--) 
     { 
      Control innerCtrl = ctrl.Controls[i]; 

      if (innerCtrl.Controls.Count > 0) 
      { 
       // Recurse to drill down through all controls 
       this.DisposeControls(innerCtrl); 
      } 

      innerCtrl.Dispose(); 
     } 
    }