2016-06-18 10 views
0

私は、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かそこらはそれが元の位置に戻します移動してしまいます。それは非常に奇妙なことですが、その機能を呼び出すボタンを数回押した場合は、そのボタンが押されるたびに、すべてが元の位置に戻ってくるまで、元の位置に戻ります。私はここで間違って何をしていますか?

+0

私はより良い挙動を示すためにユーチューブの動画を追加しました:https://youtu.be/-WlJoymLcSs –

+0

あなたがあるコレクションを変更しています反復する。 Controls.Add()呼び出し*はグループボックスから*削除します。実際にはforeachループは他のすべてのコントロールをスキップします。逆順に反復するか、Controlsコレクションのコピーを作成する必要があります。 'foreach(groupBx.Controls.OfType .ToList())のvar cと同じです。また、NullReferenceExceptionでコードがクラッシュするのを防ぎます。 –

答えて

0

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); 
      } 
+0

あなたは正しいです。全体を見落とした。ありがとうございました! –

関連する問題