簡體   English   中英

從WinForm刪除動態添加的控件

[英]Removing dynamically added controls from WinForm

我有一個GroupBox,可以在其中動態添加控件。 我添加的控件有兩種類型DevExpress.XtraEditors.TextEditWindows.Forms.Label我正嘗試使用以下命令刪除這些控件

foreach (Control control in salesBox.Controls)
{
  control.Dispose(); 
  salesBox.Controls.Remove(control);
} 

這是正確刪除TextEdit控件,而不是Label控件。 循環沒有遍歷Label控件。

它不起作用,因為您正在修改要迭代的集合。 調用Dispose()方法還會從父級的Control集合中刪除一個控件。 副作用是您將只處置偶數編號的控件。 這兩個循環中的任何一個都可以完成工作:

while (salesBox.Controls.Count > 0) salesBox.Controls[0].Dispose();

for (int ix = salesBox.Controls.Count-1; ix >= 0; ix---) salesBox.Controls[ix].Dispose();

或者將它們放在面板上並丟棄該面板。

從控件集合中刪除所有控件的最簡單方法是調用其Clear方法:

salesBox.Controls.Clear();

修改集合可能會使枚舉器無效,並產生不可預測的結果,甚至拋出InvalidOperationException ,具體取決於集合類型(請參閱MSDN上IEnumerable.GetEnumerator方法中的“備注”部分)。 由於foreach使用枚舉器,因此您不應更改正在迭代的集合。

如果必須有選擇地刪除並向后迭代,請使用for語句,以免在刪除項目后得到錯誤的索引值:

for (int i = salesBox.Controls.Count - 1; i >= 0; i--) {
    Control c = salesBox.Controls[i];
    if (c is TextEdit || c is Label) {
        salesBox.Controls.RemoveAt(i);
    }
}

您不能在Foreach中更改集合的內容。 我相信您需要做這樣的事情。

List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList();

foreach(Control c in toRemove)
{
 salesBox.Controls.Remove(c);
 c.Dispose();
}

因為salesbox.Controls的長度salesbox.Controls更改,所以Foreach無法迭代。 如果您添加或刪除項目,則最好用於for目的:

   for(int i=0;i<salesBox.Controls.Count;i++)
    {      if(salesBox.Controls[i] is DevExpress.XtraEditors.TextEdit) //your condition here
           { 
             salesBox.Controls.Remove(salesBox.Controls[i]);
             i--;
          }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM