2017-03-08 57 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())过程,首先调用它,而不是运行代码以添加新标签。 这个调用可能对用户是盲目的,或者你可以强制清除调用