[英]Why does this not reset all controls to original position?
因此,我創建了一個名為StatePanel的面板,該面板來自Panel類的繼承,但還有一些額外的字段,例如OrigXPosition和OrigYPosition(均在開始時進行了初始化)。 這些可以從tabPage拖放到組框中。 但是,我希望有一個重置按鈕,每當我按下它時,它就會遍歷每個組框,並帶走每個狀態面板以移回到選項卡控件中的原始位置。 為此,我想到了以下代碼:
private void ResetStatePanels()
{
foreach (Control groupBx in tabPageRegions.Controls){
if (groupBx.Name.Substring(0, 2) == "gb")
{
foreach (Control c in groupBx.Controls)
{
StatePanel sp1 = c as StatePanel;
tabPageRegions.Controls.Add(sp1);
sp1.Location = new Point(sp1.OrigXPosition, sp1.OrigYPosition);
}
}
}
}
但是,當我運行該代碼時,每個組框中的每個其他狀態面板最終都會移回到其原始位置。 這很奇怪,因為不僅如此,而且如果我再按幾次調用該功能的按鈕,那么每次我按下它的次數都會越來越多地移回原始位置,直到所有這些都在那里。 我在這里做錯了什么?
通過foreach (Control c in groupBx.Controls)
,您正在迭代時移除集合中的元素,這是一種反模式。
一種解決方案是預先創建另一個集合:
StatePanel[] panels = groupBx.Controls.OfType<StatePanel>().ToArray();
foreach (StatePanel sp1 in panels)
{
tabPageRegions.Controls.Add(sp1);
sp1.Location = new Point(sp1.OrigXPosition, sp1.OrigYPosition);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.