2009-01-08 4 views
11

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

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

Sección # 2 es un conjunto de 5 controles diferentes ... basada en una serie de factores, 1 de los 5 controles se hace visible, todos los demás tienen la propiedad visible configurada como falsa

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

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

El problema viene de la Sección # 2 ... cuando cambio la visibilidad de cualquiera de los controles aparecen muy bien (IE ... Sección 1, luego Sección 2, luego Sección 3) ... EXCEPTO cuando configuré el el control del combobox es Visible ... en ese caso, y SÓLO en ese caso ... el pedido se convierte en (Sección 1, luego Sección 3, luego Sección 2) ... No puedo entender qué haría que el pedido salga de sincronización en ese caso.

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

¿Alguien tiene alguna experiencia con el orden de control del panel de disposición de flujo? No puedo entender qué está pasando con ComboBox.

Respuesta

5

¿Podría ser más fácil colocar otro panel de diseño de flujo en la sección 2, luego soltar los controles de la sección 2? De esta forma, los controles visibles en su panel superior nunca cambian y no tendrá que preocuparse por los pedidos.

26

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

Dado que FlowLayoutPanel usa los índices de control para determinar en qué orden dibujarlos, puede establecer esto con el índice de control con el que quiera intercambiar, y se activará el índice de controles en uno, y luego en cada uno.

Aquí es fragmento de mi blog de PictureBoxes de reordenamiento en un FlowLayoutPanel

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



} 
0

SetChildIndex no restablece el orden de los controles en el panel FlowLayout . Entonces, cuando realizamos FlowLayoutPanel.GetNextControl(q, true), la salida no es correcta.

+0

También debe cambiar el TabOrder. Puede configurar esto cuando el índice también cambie. –

2

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

1

Pruebe esta solución genérica donde puede ordenar los 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)); 
} 
Cuestiones relacionadas