14

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

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

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

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

要約すると、セクション 2 は可変で、その他は静的です。

問題はセクション#2に付属しています...コントロールの可視性を変更すると、それらは問題なく表示されます(IE ...セクション1、セクション2、セクション3)...コンボボックスコントロールを可視....その場合、その場合にのみ..順序は(セクション1、セクション3、セクション2)になります...何が原因で順序が同期されなくなるのかわかりませんその場合。

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

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

4

6 に答える 6

34

内部には、オブジェクトを特定のインデックスに設定できるFlowLayoutPanel.Controlsメソッド関数が呼び出されます。SetChildIndex(Control c, int index)

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

以下は、FlowLayoutPanel での PictureBoxes の並べ替えに関する私のブログのスニペットです。

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

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);
    }
}
于 2009-07-30T15:30:10.037 に答える
4

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

于 2009-01-08T20:56:29.763 に答える
2

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

于 2010-10-04T09:32:22.737 に答える
1

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

// 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));
}
于 2014-07-11T13:30:12.777 に答える
0

SetChildIndexフローレイアウト パネルのコントロールの順序はリセットされません。そのため、出力を実行FlowLayoutPanel.GetNextControl(q, true)すると正しくありません。

于 2010-02-11T20:00:28.787 に答える