visual tag tabulacion studio propiedades propiedad orden formulario eventos controles comunes c# winforms user-interface controls

tag - Orden de controles en la propiedad Control de un formulario en C#



orden de tabulacion visual studio 2017 (5)

¿Es realmente un problema?

Siempre que la UI funcione correctamente (en términos de orden de tabulación, por ejemplo), le recomendaría que no haga suposiciones sobre el orden en que están enumeradas.

EDITAR: Gracias por explicar su requerimiento con más detalle. Creo que aún recomendaría no usar el orden en que están almacenados en la colección Controls. Siempre es mejor considerar estos detalles de implementación como ''opacos''. Tiene una etiqueta asociada a cada control, por lo que puede usar esto para identificar el control correcto. Para acelerar el procesamiento, puedes construir una matriz de 7 elementos que haga referencia a los controles por ordinal:

FlowLayoutPanel[] panels = new FlowLayoutPanel[7]; foreach(FlowLayoutPanel panel in this.Controls) { panels[(int)panel.Tag] = panel; } // Now, you can reference the panels directly by subscript: panels[2].BackColor = Color.Aquamarine;

¡Aunque hice una comprobación de tipos para hacer que este código sea un poco más robusto!

Tengo un problema peculiar con el orden en que FlowLayoutPanels se agrega a la propiedad de controles del formulario. Esto es lo que intenté,

Agregué 7 FlowLayoutPanels en una aplicación de ventana C # de izquierda a derecha en tiras verticales. Luego etiqueté los diseños de flujo como 1, 2, 3, ... 7 nuevamente de izquierda a derecha. Ahora en el controlador de carga del formulario, escribí el siguiente fragmento,

foreach (FlowLayoutPanel aDaysControl in this.Controls) { MessageBox.Show(aDaysControl.Tag.ToString()); }

Esperaba que los mensajes aparecieran en el orden de 1, 2, ... 7 . Pero lo obtuve en el orden inverso (7, 6, ... 1). ¿Podría alguien ayudarme con el error que cometí?

Motivo de preservar el orden,

Estoy tratando de hacer un control de calendario con cada fila que representa un día. Si un mes comienza a partir del miércoles, entonces necesito agregar una etiqueta vacía a la primera (lunes) y la segunda fila (martes). Entonces el orden importa un poco


observe el orden en que se agregan al formulario en el archivo yourForm.designer.cs


si nos fijamos en el código generado por el diseñador Form1.designer.cs se verá algo como esto:

// // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(658, 160); this.Controls.Add(this.flowLayoutPanel7); this.Controls.Add(this.flowLayoutPanel6); this.Controls.Add(this.flowLayoutPanel5); this.Controls.Add(this.flowLayoutPanel4); this.Controls.Add(this.flowLayoutPanel3); this.Controls.Add(this.flowLayoutPanel2); this.Controls.Add(this.flowLayoutPanel1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false);

fíjate cómo se creó, agregaste primero el panel 1, luego 2, etc. pero a medida que el código se ejecuta agregará 7 primero y luego 6.

este código estará en la función InitializeComponent () generada por el diseñador.

¿Por qué los necesitas para ejecutar en cierto orden?

No confiaría en el diseñador para mantener el orden que desea ... ordenaría los controles yo mismo:

var flowpanelinOrder = from n in this.Controls.Cast<Control>() where n is FlowLayoutPanel orderby int.Parse(n.Tag.ToString()) select n; /* non linq List<Control> flowpanelinOrder = new List<Control>(); foreach (Control c in this.Controls) { if (c is FlowLayoutPanel) flowpanelinOrder.Add(c); } flowpanelinOrder.Sort(); * */ foreach (FlowLayoutPanel aDaysControl in flowpanelinOrder) { MessageBox.Show(aDaysControl.Tag.ToString()); }


Sé que esta es una pregunta bastante antigua, pero ...

Es posible que desee utilizar SetChildIndex . por ejemplo, this.Controls.SetChildIndex(button1, 0);


¿Qué sucede si en el futuro algún otro diseñador elimina los controles, vuelve a agregarse, etc.? Controlar al diseñador siempre es un desastre. Lo que sería mejor es ordenar los controles en el control del contenedor antes de enumerar. Yo uso este método de extensión (si tienes Linq):

public static List<Control> ToControlsSorted(this Control panel) { var controls = panel.Controls.OfType<Control>().ToList(); controls.Sort((c1, c2) => c1.TabIndex.CompareTo(c2.TabIndex)); return controls; }

Y tu puedes:

foreach (FlowLayoutPanel aDaysControl in this.ToControlsSorted()) { MessageBox.Show(aDaysControl.TabIndex.ToString()); }

(Arriba es para TabIndex ). Sería trivial clasificar de acuerdo con Tag .