[英]Foreach skipping a control on usercontrol
我有一個帶有面板的用戶控件,名為panel1。 我在設計器視圖中添加了它。 從組合框中選擇一個選項后,在這種情況下,我向用戶控件添加了兩個標簽( 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()
檢查了多少控件具有usercontrol:它說,uc有3個控件(通過GetType()
函數,我找到了一個面板和兩個標簽-因此它找到了每個控件控制)。
因此,在第二次運行CreateLabelsForMainAspetcs(List<string> mainAspects)
之后,沒有3個控件,而是4個控件。 1個面板和3個標簽。
之后,如果我只希望顯示一個標簽:在列表中使用一個字符串運行dispose代碼和createlabel-用戶控件上只有一個標簽,第二個是Disapper。 但是Controls.Count
表示有4個控件-1個面板和3個標簽。 您能幫我做錯什么嗎?
我猜想在遍歷Controls
集合時對這些標簽進行處理會篡改collection,因此會停止對首次處理的Label進行迭代。
為什么不嘗試將它們添加到List<Label>
而不是進行處理。 將所有Label控件添加到列表后,循環瀏覽該列表並將其刪除。
所以,代替
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();
}
選項一:可以在控件中使用ListBox:如果可以,則在UC中使用ListBox並在父級中維護一個List,並將UC ListBox.source設置為列表。 當您調整清單時,它會自動更新
選項二創建一個默認視圖(Usercontrol.Clear())過程,首先調用它,然后運行代碼以添加新標簽。 此呼叫可能對用戶不可見,也可以強制清除呼叫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.