コード内に、トップダウンで配置された FlowLayoutPanel にコントロールを動的に追加する場所があります。コントロールを特定の順序で表示する必要があるため、毎回行っていることは、FlowLayoutPanel.Controls コレクションをクリアしてから、表示する順序で各子コントロールを追加することです。私のコードはこれを行います:
private void arrangement1()
{
flowLayoutPanel1.Controls.Clear();
flowLayoutPanel1.Controls.Add(control1);
flowLayoutPanel1.Controls.Add(control2);
flowLayoutPanel1.Controls.Add(control3);
}
ほとんどの場合、これはうまく機能します。ただし、後に他のコントロールを追加するときに、コントロール コレクション内の位置を維持しない特定のコントロールが 1 つあります。たとえば、次のコード セグメントでは:
private void arrangement2()
{
flowLayoutPanel1.Controls.Clear();
flowLayoutPanel1.Controls.Add(control1);
flowLayoutPanel1.Controls.Add(movingControl);
//movingControl current is at index = 1 in Controls.
flowLayoutPanel1.Controls.Add(control2);
//control2 is now at index = 1, movingControl got bumped to index = 2 in Controls.
flowLayoutPanel1.Controls.Add(control3);
//control3 is now at index =2, movingControl got bumped to index = 3 in Controls.
}
これは、movingControl が Controls に初めて追加されたときにのみ発生します。戻って、arrangement1 を呼び出してから、arrangement2 をもう一度呼び出すとします。コントロールは、次の順序で表示されます。
- コントロール1
- 移動制御
- コントロール2
- コントロール3
これは、Controls.Add のコードのバグのようです。コレクションの最後に常に追加されるとは限らないため、それまたは .Add の動作に関するドキュメントは不完全です。なぜこれが起こるのか、誰にも洞察がありますか。明らかな「修正」は、次のように呼び出すことです。
arrangement2();
arrangement1();
arrangement2();
ただし、それは他の根本的な問題に対する非常に貧弱な解決策のようです。
助けてくれてありがとう!
編集: これらの各コントロールはカスタム ビュー クラスのメンバーであるため、Controls コレクションが Cleared された後も保持されることに注意してください。ただし、これらのコントロールは、順序付けられたコレクションには格納されません。これらは、このカスタム クラスの単なるメンバーです。上記のコードは、示されているように正しく機能します。ただし、私のGUIプログラムのコンテキストでは、説明されている誤った動作があります。何が役立つかがわかれば、さらにコードを投稿しますが、これらのピースに触れるコードはたくさんあります。これは、記述されたアクションのために実行されるすべてのコードです。
私が本当に探しているのは、考えられるシナリオによって、Controls.Add がコレクションの最後のインデックスではなくコントロールを挿入する原因となるものです。具体的には、Clear() の呼び出し後、Remove() 呼び出しなし。