Переопределение элементов управления в панели раскладки потока

У меня возникли проблемы с использованием flowlayoutPanel в приложении winform С#. У меня в основном есть панель макета потока, которая имеет 3 раздела.

Раздел №1 представляет собой набор из 2 элементов управления. Два элемента управления выпадающего меню, они всегда находятся в одном порядке, всегда отображаются во всех экземплярах

Раздел №2 представляет собой набор из 5 различных элементов управления... на основе ряда факторов, 1 из 5 элементов управления становится видимым, все остальные имеют значение Visible propertyt равное false

Раздел № 3 представляет собой набор из 3 элементов управления. Например, раздел №1, они всегда в одном порядке и всегда видны.

Так что это сводится к тому, что раздел №2 является переменным, остальные являются статическими.

Проблема связана с разделом № 2... когда я изменяю видимость любого из элементов управления, которые они кажутся просто прекрасными (IE... Раздел 1, затем Раздел 2, затем Раздел 3)... ЗА ИСКЛЮЧЕНИЕМ, когда я устанавливаю выпадающий список контроль должен быть видимым.... в этом случае, и ТОЛЬКО в этом случае.. заказ становится (раздел 1, затем раздел 3, а затем раздел 2)... Я не могу понять, что приведет к тому, что заказ будет отсутствовать синхронизация в этом случае.

То, что я в основном делаю в начале моего метода, задает ВСЕ элементы управления Visible = false... тогда я устанавливаю раздел 1 Visible = true... затем перебираю условия раздела 2 и устанавливаю соответствующие элементы управления Visible = true и, наконец, установить элементы управления Section 3 Visible = true.

Есть ли у кого-нибудь опыт управления настройками панели управления потоком? Я не могу понять, что происходит для ComboBox.

Ответ 1

Может ли быть проще сбросить еще один flowlayoutpanel для раздела 2, а затем добавить в него элементы управления раздела 2? Таким образом, видимые элементы управления на верхней панели никогда не меняются, и вам не придется беспокоиться о заказе.

Ответ 2

Внутри FlowLayoutPanel.Controls находится метод-метод SetChildIndex(Control c, int index) который позволяет вам установить объект для определенного индекса.

Поскольку FlowLayoutPanel использует индексы управления, чтобы определить, в каком порядке их рисовать, вы можете установить для него тот индекс управления, с которым вы хотите обменяться, и он будет увеличивать этот элемент управления на единицу, и каждый после этого.

Вот фрагмент из моего блога по переупорядочению PictureBox в 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);
    }
}

Ответ 3

Вы можете изменить порядок контроля над потоковой панелью, изменить родительское свойство элементов управления и переназначить родительское свойство в том порядке, в котором вы нуждаетесь.

Ответ 4

Попробуйте это общее решение, в котором вы можете сортировать элементы управления в соответствии с свойством в пользовательском элементе управления.

// 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));
}

Ответ 5

SetChildIndex не reset порядок элементов управления на панели flowlayout. Поэтому, когда мы выполняем FlowLayoutPanel.GetNextControl(q, true), вывод неправильный.

Ответ 6

Для базового упорядочения элементов управления простейший способ контролировать порядок элементов управления в flowlayoutPanel - установить для свойства flowlayoutPanel TabStop значение true. Установите для свойства tabstop для элементов управления значение True и установите порядок вкладок в том порядке, в котором вы хотите, чтобы элементы управления отображались.