Изменение порядка элементов управления в панели макета потока - PullRequest
12 голосов
/ 08 января 2009

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

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

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

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

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

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

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

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

Ответы [ 6 ]

28 голосов
/ 30 июля 2009

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

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

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

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

2 голосов
/ 04 октября 2010

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

1 голос
/ 11 июля 2014

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

// 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));
}
0 голосов
/ 21 марта 2018

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

0 голосов
/ 11 февраля 2010

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

...