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

StackOverflow https://stackoverflow.com/questions/425867

Вопрос

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

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

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

Раздел # 3 представляет собой набор из 3-х элементов управления. Как и раздел # 1, они всегда в одном и том же порядке и всегда видны.

Итак, все сводится к тому, что раздел # 2 является переменным, остальные - статическими.

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

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

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

Это было полезно?

Решение

Может быть, проще добавить еще одну панель Flowlayout для раздела 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);
    }
}

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

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

// 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 не сбрасывает порядок элементов управления на панели разметки. Поэтому, когда мы выполняем FlowLayoutPanel.GetNextControl (q, true) , вывод не верен.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top