3

コード内に、トップダウンで配置された 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() 呼び出しなし。

4

2 に答える 2

1

Arrangement1を最初に実行すると、次のようになります。control1 control2 control3

アレンジメント2を実行すると、次のようになります。

あなたのコードは、投稿されたままの状態で、私のために機能します。

しかし、最近私は同様の問題に遭遇しました。私はコントロールをリストに保持し、それを繰り返してフローレイアウトに追加していました。リストから1つのアイテムを削除してから、新しいコントロールを追加しても、最後に新しいコントロールは挿入されず、削除されたアイテムによって残された空いている場所が置き換えられます。

要約すると、それはあなたが投稿していないものだと思います。おそらく、コントロール自体をどこに保存するのでしょうか。それらを配列またはリストに格納しますか?

于 2010-02-08T17:15:23.903 に答える
0

movingControl の可視性を切り替えるだけの方が簡単ではないでしょうか?

しかし、その答えはあなたの例に基づいていると思います。そのため、さらに再配置が行われている場合、これは当てはまらない可能性があります。

可視性の切り替えと併せて、代わりにControlCollection.SetChildIndex()を使用することを検討することもできます。これは、より適切であり、よりスムーズな並べ替えを生成する可能性が高いと思われます。

于 2010-06-21T18:10:16.377 に答える