Pregunta

Tengo problemas para usar flowlayoutPanel en una aplicación C # winform. Lo que básicamente tengo es un panel de diseño de flujo que tiene 3 secciones.

La sección # 1 es un conjunto de 2 controles ... dos controles desplegables, siempre están en el mismo orden, siempre visibles en todos los casos

La sección # 2 es un conjunto de 5 controles diferentes ... basado en una serie de factores, 1 de los 5 controles se hace visible, todos los demás tienen la propiedad Visible establecida en falso

La sección # 3 es un conjunto de 3 controles ... como la sección # 1, siempre están en el mismo orden y siempre visibles.

Entonces, todo esto se reduce a que la Sección # 2 es variable, las otras son estáticas.

El problema viene con la Sección # 2 ... cuando cambio la visibilidad de cualquiera de los controles, parecen estar bien (IE ... Sección 1, luego Sección 2 y luego Sección 3) ... EXCEPTO cuando configuro el cuadro combinado el control sea Visible ... en ese caso, y SOLO en ese caso ... el orden se convierte en (Sección 1, luego en Sección 3 y luego en Sección 2) ... No puedo entender qué causaría que el pedido no estuviera disponible sincronizar solo en ese caso.

Lo que básicamente hago al comienzo de mi método es establecer TODOS los controles en Visible = falso ... luego configuro la Sección 1 Visible = verdadero ... luego recorro las condiciones de la Sección 2 y establezco los controles apropiados Visible = true y finalmente establece los controles de la Sección 3 Visible = true.

¿Alguien tiene alguna experiencia con el orden de control del panel de diseño de flujo? No puedo entender lo que está sucediendo para el ComboBox.

¿Fue útil?

Solución

¿Podría ser más fácil colocar otro panel de flujo de salida en la sección 2, y luego colocar los controles de la sección 2 en eso? De esa manera, los controles visibles en su panel superior nunca cambian y no tendrá que preocuparse por ordenar.

Otros consejos

Dentro de FlowLayoutPanel.Controls es una función de método llamada SetChildIndex (Control c, int index) que le permite establecer un objeto en un índice específico.

Dado que FlowLayoutPanel usa los índices de control para determinar en qué orden dibujarlos, puede establecerlo en el índice de control con el que desee intercambiar, y aumentará ese índice de controles en uno, y cada uno después de eso.

Aquí hay un fragmento de mi blog de reordenar PictureBoxes en un FlowLayoutPanel.

Agregue un FlowLayoutPanel en un WinForm llamado 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);
    }
}

Puede reordenar los controles en el panel de flujo, cambiar la propiedad principal de los controles y reasignar la propiedad principal con el orden que necesite.

Pruebe esta solución genérica donde puede ordenar sus controles de acuerdo con una propiedad en el control del usuario.

// 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 no restablece el orden de los controles en el panel de distribución de flujo. Entonces, cuando realizamos FlowLayoutPanel.GetNextControl (q, true) la salida no es correcta.

Para el orden de control básico, la forma más sencilla de controlar el orden de los controles en flowlayoutPanel es establecer la propiedad flowlayoutPanel TabStop en true. Establezca la propiedad de tabulación de controles en True y establezca el orden de tabulación en el orden en que desea que aparezcan los controles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top