Cómo establecer el orden Z de un control usando WinForms

Estoy escribiendo un TextBox personalizado que al ganar el foco cambia su estilo de borde.

Como al agregar un borde hace que el control se superponga con los que lo rodean, llevo temporalmente el cuadro de texto al frente del cuadro de diálogo (usando textBox.BringToFront() ).

Sin embargo, una vez que se completa la edición y se pierde el foco, me gustaría devolver el control a su posición original en el orden Z.

Es posible (preferiblemente de una manera simple!)

Llame a los métodos GetChildIndex y SetChildIndex de la colección Controls de los padres.

No hay orden Z como había en VB, pero puede usar los métodos GetChildIndex y SetChildIndex para obtener y configurar sus índices manualmente.

Aquí hay un ejemplo de cómo usarlo. Es probable que necesite mantener un registro de cada índice de controles para que pueda volver a configurarlo cuando haya terminado.

Algo como esto es probablemente lo que buscas:

 // Get the controls index int zIndex = parentControl.Controls.GetChildIndex(textBox); // Bring it to the front textBox.BringToFront(); // Do something... // Then send it back again parentControl.Controls.SetChildIndex(textBox, zIndex); 

Cuando se usa con el FlowLayoutPanel esto moverá un control hacia arriba o hacia abajo

  ///  /// When used with the FlowLayoutPanel this will move a control up or down ///  ///  ///  private void C_On_Move(object sender, int UpDown) { //If UpDown = 1 Move UP, If UpDown = 0 Move DOWN Control c = (Control)sender; // Get the controls index int zIndex = _flowLayoutPanel1.Controls.GetChildIndex(c); if (UpDown==1 && zIndex > 0) { // Move up one _flowLayoutPanel1.Controls.SetChildIndex(c, zIndex - 1); } if (UpDown == 0 && zIndex < _flowLayoutPanel1.Controls.Count-1) { // Move down one _flowLayoutPanel1.Controls.SetChildIndex(c, zIndex + 1); } }