سؤال

وأواجه مشكلة في استخدام flowlayoutPanel في تطبيق C # winform. ما أنا في الأساس يكون هو لجنة تخطيط تدفق التي لديها 3 أقسام.

القسم رقم 1 هو عبارة عن مجموعة من الضوابط 2 .. عنصري تحكم المنسدلة، هم دائما في نفس النظام، دائما واضحة في جميع الحالات

القسم رقم 2 هو عبارة عن مجموعة من 5 ضوابط مختلفة ... بناء على سلسلة من العوامل، جعلت 1 من 5 ضوابط واضحة، كل الآخرين لديهم الملكيه المرئية إلى false

والقسم رقم 3 هو عبارة عن مجموعة من الضوابط 3 .. مثل القسم رقم 1 هم دائما في نفس الترتيب ودائما مرئية.

وهكذا ما هذا يتلخص في أن المادة رقم 2 هو متغير، والبعض الآخر ثابت.

والمشكلة تأتي مع القسم رقم 2 ... عندما أقوم بتغيير رؤية أي من عناصر التحكم التي تظهر على ما يرام (IE ... القسم 1 القسم 2 ثم بعد ذلك القسم 3) ... إلا عندما أنا وضعت منسدل السيطرة لتكون واضحة .... في هذه الحالة، وفقط في هذه الحالة .. يصبح النظام (القسم 1 ثم القسم 3 ثم القسم 2) ... أنا لا يمكن معرفة ما يمكن أن يتسبب في ترتيب لتكون بعيدة عن مزامنة فقط في هذه الحالة.

وماذا أفعل في الأساس في بداية طريقة قد تم تعيينه ALL ضوابط لالمرئية = كاذبة ... ثم أنا وضعت القسم 1 المرئية = الحقيقية ... ثم حلقة من خلال شروط القسم 2 ووضع الضوابط المناسبة مرئي = الحقيقية وأخيرا مجموعة القسم 3 ضوابط واضحة = صحيح.

هل لديها أي خبرة مع تخطيط تدفق ترتيب لوحة التحكم؟ أنا لا يمكن معرفة ما يحدث لتحرير وسرد.

هل كانت مفيدة؟

المحلول

قد يكون من الأسهل لإسقاط flowlayoutpanel آخر في لقسم 2، ثم إسقاط الخاص قسم 2 الضوابط في ذلك؟ وبهذه الطريقة، وضوابط واضحة في أعلى لوحة الخاص بك لا تتغير أبدا، وسوف لا يكون لديك ما يدعو للقلق الطلب.

نصائح أخرى

وداخل FlowLayoutPanel.Controls هي وظيفة طريقة تسمى SetChildIndex(Control c, int index) الذي يسمح لك لتعيين كائن إلى مؤشر معين.

ومنذ FlowLayoutPanel يستخدم مؤشرات التحكم لتحديد أي من أجل الاستفادة منها في، يمكنك تعيين هذا إلى أيهما التحكم مؤشر كنت ترغب في مبادلة مع، وسيكون عثرة أن مؤشر الرقابة من قبل واحدة، وكل واحد بعد ذلك.

وهنا مقتطفا من وجهة نظري من إعادة ترتيب PictureBoxes في FlowLayoutPanel.

وإضافة FlowLayoutPanel على WinForm اسمه 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);
    }
}

ويمكنك إعادة ترتيب الرقابة على flowpanel، وتغيير الملكية الأم لضوابط وإعادة توزيع الملكية الأم مع النظام التي تحتاج إليها.

وهذه محاولة حل عام حيث يمكنك فرز لكم الضوابط وفقا لخاصية في عنصر تحكم المستخدم.

// 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 إلى صحيح. تعيين خاصية التحكم TabStop إلى صحيح وتعيين ترتيب الجدولة للنظام الذي تريد التحكم لتظهر.

scroll top