私は、Panelクラスの内側にあるStatePanelというパネルを作成しましたが、OrigXPositionやOrigYPosition(最初に初期化されています)などのいくつかの余分なフィールドがあります。これらはタブページからグループボックスにドラッグアンドドロップできます。しかし、私はそれを押すたびに、各グループボックスを通過し、各状態パネルをタブコントロールの元の位置に戻すリセットボタンを持っていたいと思います。このように達成するために、私は、このコードを思い付いた:私はそのコードを実行するとこれは、すべてのコントロールを元の位置にリセットしないのはなぜですか?
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);
}
}
}
}
はしかし、各グループボックス内の他のすべてのはStatePanelかそこらはそれが元の位置に戻します移動してしまいます。それは非常に奇妙なことですが、その機能を呼び出すボタンを数回押した場合は、そのボタンが押されるたびに、すべてが元の位置に戻ってくるまで、元の位置に戻ります。私はここで間違って何をしていますか?
私はより良い挙動を示すためにユーチューブの動画を追加しました:https://youtu.be/-WlJoymLcSs –
あなたがあるコレクションを変更しています反復する。 Controls.Add()呼び出し*はグループボックスから*削除します。実際にはforeachループは他のすべてのコントロールをスキップします。逆順に反復するか、Controlsコレクションのコピーを作成する必要があります。 'foreach(groupBx.Controls.OfType .ToList())のvar cと同じです。また、NullReferenceExceptionでコードがクラッシュするのを防ぎます。 –