我有一个带有面板的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个标签。你能帮忙吗,我做错了什么?
答案 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())程序,首先调用它,然后再运行代码添加新标签。 此呼叫可能对用户视而不见,或者您可以强制清除呼叫