2017-03-08 43 views
0

我有一個用戶控件,帶有一個名爲panel1的面板。我在設計師視圖中添加了它。 選擇從下拉框選擇,在這種情況下後,我兩個標籤添加到UserControl(mainAspects有兩個字符串):Foreach在用戶控件上跳過一個控件

private void CreateLabelsForMainAspetcs(List<string> mainAspects) 
    { 
     int mainCount; 
     int firstLabelX; 
     int firstLabelY; 
     int addToFirstLabelY = 0; 

     mainCount = mainAspects.Count; 
     firstLabelX = 22; 
     firstLabelY = 149; 

     for (int i = 0; i < mainCount; i++) 
     { 
       Label mainAsp = new Label(); 
       mainAsp.Text = mainAspects[i]; 
       mainAsp.Location = new Point(firstLabelX, firstLabelY + addToFirstLabelY); 
       mainAsp.AutoSize = true; 
       Controls.Add(mainAsp); 
       addToFirstLabelY = addToFirstLabelY + 100; 
     } 
    } 

後,當用戶從下拉框的另一種選擇,我想處置標籤與此代碼:

foreach (Control ctrl in this.Controls) 
      { 
       if (ctrl is Label) 
        ctrl.Dispose(); 
      } 

並創建新的與CreateLabelsForMainAspetcs(List<string> mainAspects)。 但foreach循環只能通過panel1和第一個標籤,退出後(跳過第二個標籤)。

我在foreach循環之前檢查了有多少個控件有this.Controls.Count.ToString()用戶控件:它說,uc有3個控件(用GetType()函數我找到了一個面板和兩個標籤 - 所以它找到了每個控件)。

因此在第二次運行CreateLabelsForMainAspetcs(List<string> mainAspects)之後,沒有3個,而是4個控件。 1個面板和3個標籤。

之後,如果我只希望顯示一個標籤:在List中運行處理代碼和createlabel中的一個字符串 - 在usercontrol上只有一個標籤,第二個disappers。但Controls.Count說,有4個控件 - 1個面板和3個標籤。你能幫忙嗎,我做錯了什麼?

+0

我錯誤地認爲調用dispose什麼都不做?由於控件中仍然有對要處理的標籤的引用?也許從控件中刪除標籤,然後處理它。 – Sebastien

回答

0

我猜測,通過Controls集合篡改與集合迭代處置這些標籤,並因爲停止迭代在第一個處置標籤。

爲什麼不嘗試將它們添加到List<Label>而不是處置。當所有Label控件都添加到List時,循環遍歷該列表並將其刪除。

所以,與其

foreach (Control ctrl in this.Controls) 
{ 
    if (ctrl is Label) 
     ctrl.Dispose(); 
} 

嘗試

List<Label> labelList = this.Controls.OfType<Label>().ToList(); 
foreach(Label lbl in labelList) 
{ 
    lbl.Dispose(); 
} 
+0

非常感謝你:) – donmichael

0

方案一:您可以在控制使用列表框:如果是,那麼用在UC列表框,並保持在一個列表您父母並將UC ListBox.source設置爲列表。這應該會在您調整列表時自動更新

選項二 會創建一個默認視圖(Usercontrol.Clear())過程,首先調用它,而不是運行代碼以添加新標籤。 這個調用可能對用戶是盲目的,或者你可以強制清除調用

相關問題