質問

C#winformアプリケーションでflowlayoutPanelを使用すると問題が発生します。基本的に3つのセクションがあるフローレイアウトパネルです。

セクション#1は2つのコントロールのセットです。2つのドロップダウンコントロール。これらは常に同じ順序で、すべてのインスタンスで常に表示されます

セクション2は5つの異なるコントロールのセットです...一連の要因に基づいて、5つのコントロールのうち1つが表示され、他のすべてのコントロールは可視プロパティがfalseに設定されています

セクション#3は3つのコントロールのセットです。セクション#1と同様に、常に同じ順序で表示されます。

つまり、これは、セクション2が可変であり、その他は静的であるということです。

問題はセクション2にあります...コントロールの可視性を変更すると、それらはうまく表示されます(つまり、セクション1、次にセクション2、次にセクション3)...コンボボックスを設定する場合を除きますコントロールが表示されるように....その場合のみ、その場合のみ..順序は(セクション1、次にセクション3、次にセクション2)になります...順序が外れる原因がわからないその場合にのみ同期します。

メソッドの最初に基本的に行うことは、すべてのコントロールをVisible = falseに設定し、次にセクション1 Visible = trueを設定し、セクション2の条件をループして適切なコントロールVisible =を設定しますtrueで最後にセクション3コントロールVisible = trueを設定します。

フローレイアウトパネルコントロールの順序付けの経験はありますか? ComboBoxで何が起こっているのかわかりません。

役に立ちましたか?

解決

セクション2の別のflowlayoutpanelをドロップしてから、セクション2のコントロールをその中にドロップする方が簡単ですか?そうすれば、トップパネルに表示されるコントロールが変更されることはなく、順序を気にする必要もありません。

他のヒント

Inside FlowLayoutPanel.Controls は、 SetChildIndex(Control c、int index)と呼ばれるメソッド関数です。これにより、オブジェクトを特定のインデックスに設定できます。

FlowLayoutPanelはコントロールのインデックスを使用して描画する順序を決定するため、これをスワップしたいコントロールのインデックスに設定すると、そのコントロールのインデックスが1つずつ上がり、その後は1つずつ上がります。

ブログ FlowLayoutPanelでPictureBoxを並べ替える方法。

flowLayoutPanel1 という名前のWinFormにFlowLayoutPanelを追加します:

public partial class TestForm: Form
{
   public TestForm()
    {
        InitializeComponent();
        this.flowLayoutPanel1.AllowDrop = true
    }

    private void AddImageToBlog(System.Drawing.Image image)
    {
        PictureBox pbox = new PictureBox();
        pbox.SizeMode = PictureBoxSizeMode.Zoom;            
        pbox.Height = (_picturebox_height * _ScaleFactor);
        pbox.Width = (_picturebox_width * _ScaleFactor);
        pbox.Visible = true;
        pbox.Image = image;

        pbox.MouseDown += new MouseEventHandler(pbox_MouseDown);
        pbox.DragOver += new DragEventHandler(pbox_DragOver);            
        pbox.AllowDrop = true;
        flpNewBlog.Controls.Add(pbox);
    }

    void pbox_DragOver(object sender, DragEventArgs e)
    {
        base.OnDragOver(e);
        // is another dragable
        if (e.Data.GetData(typeof(PictureBox)) != null)
        {
            FlowLayoutPanel p = (FlowLayoutPanel)(sender as PictureBox).Parent;                 
            //Current Position             
            int myIndex = p.Controls.GetChildIndex((sender as PictureBox));

            //Dragged to control to location of next picturebox
            PictureBox q = (PictureBox) e.Data.GetData(typeof(PictureBox));                
            p.Controls.SetChildIndex(q, myIndex);
        }           
    }

    void pbox_MouseDown(object sender, MouseEventArgs e)
    {
        base.OnMouseDown(e);
        DoDragDrop(sender, DragDropEffects.All);
    }
}

フローパネルでコントロールを並べ替え、コントロールの親プロパティを変更し、必要な順序で親プロパティを再割り当てできます。

ユーザーコントロールのプロパティに従ってコントロールを並べ替えることができるこの一般的なソリューションを試してください。

// When adding and removing controls, the order is not kept.
var runsOrderedByStartDate = this.nodesFlowLayoutPanel.Controls.Cast<RunNodeControl>().Select(_ => new { StartDate = _.StartDateTime, RunControl = _ }).OrderBy(_ => _.StartDate).ToList();

// Sets index of controls according to their index in the ordered collection
foreach (var anonKeyValue in runsOrderedByStartDate)
{
    this.nodesFlowLayoutPanel.Controls.SetChildIndex(anonKeyValue.RunControl, runsOrderedByStartDate.IndexOf(anonKeyValue));
}

SetChildIndex は、flowlayoutパネルのコントロールの順序をリセットしません。したがって、 FlowLayoutPanel.GetNextControl(q、true)を実行すると、出力は正しくありません。

基本的なコントロールの順序付けの場合、flowlayoutPanelのコントロールの順序を制御する最も簡単な方法は、flowlayoutPanelのTabStopプロパティをtrueに設定することです。コントロールのtabstopプロパティをTrueに設定し、タブの順序をコントロールを表示する順序に設定します。

scroll top