Foreach跳过usercontrol上的控件

时间:2017-03-08 18:08:54

标签: c# foreach user-controls

我有一个带有面板的usercontrol,名为panel1。我在设计师视图中添加了它。 从组合框中选择一个选项后,在这种情况下我向usercontrol添加了两个标签(mainAspects有两个字符串):

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中运行dispose代码和带有一个字符串的createlabel - usercontrol上只有一个标签,第二个是disappers。但Controls.Count表示有4个控件 - 1个面板和3个标签。你能帮忙吗,我做错了什么?

2 个答案:

答案 0 :(得分:0)

我猜测在迭代Controls集合篡改集合时处理这些标签,因为它会停止迭代第一个处理过的Label。

为什么不尝试将它们添加到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();
}

答案 1 :(得分:0)

选项一:您可以在控件中使用ListBox:如果是,则在UC中使用ListBox并在父级中维护一个List并将UC ListBox.source设置为列表。这应该在您调整列表时自动更新

选项二 制作一个默认视图(Usercontrol.Clear())程序,首先调用它,然后再运行代码添加新标签。 此呼叫可能对用户视而不见,或者您可以强制清除呼叫