winforms - net - Reordenación de controles dentro de un panel de diseño de flujo
propiedad del combobox (5)
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.
La sección 1 es un conjunto de 2 controles. Dos controles desplegables, siempre están en el mismo orden, siempre visibles en todas las instancias.
La Sección 2 es un conjunto de 5 controles diferentes ... basados 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. Al igual que la Sección 1, siempre están en el mismo orden y siempre visibles.
Entonces, lo que esto se reduce a esto es 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, aparecen muy bien (IE ... Sección 1, luego Sección 2, luego Sección 3) ... EXCEPTO cuando configuro el control de la lista desplegable como Visible ... en ese caso, y SÓLO en ese caso ... el orden se convierte en (Sección 1, luego Sección 3, luego Sección 2) ... No puedo entender qué haría que el orden no esté sincronizado solo 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 Visible = verdadero y finalmente establece los controles de la Sección 3 Visible = verdadero.
¿Alguien tiene alguna experiencia con el orden de control del panel de diseño de flujo? No puedo entender qué está pasando con ComboBox.
¿Sería más fácil dejar caer otro panel de salida 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.
Dentro de FlowLayoutPanel.Controls hay una función de método llamada SetChildIndex (Control c, índice int) que le permite establecer un objeto a un índice específico.
Como 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 se incrementará el índice de controles en uno, y luego en uno.
Aquí hay un fragmento de mi blog de reordenamiento de PictureBoxes en un panel de flujo de salida
// agrega 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 controles en el panel de flujo, cambiar la propiedad primaria de los controles y reasignar la propiedad principal con el orden que necesita.
SetChildIndex
no restablece el orden de los controles en el panel de distribución de flujo. Entonces cuando FlowLayoutPanel.GetNextControl(q, true)
el resultado no es correcto.
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));
}