web-dev-qa-db-fra.com

Comment définir l'ordre Z d'un contrôle à l'aide de WinForms

J'écris une coutume TextBox qui, après avoir obtenu le focus, change son style de bordure.

L'ajout d'une bordure faisant en sorte que le contrôle se chevauche avec ceux qui le bordent, j'apporte temporairement la zone de texte au début de la boîte de dialogue (à l'aide de textBox.BringToFront()).

Cependant, une fois l’édition terminée et la mise au point perdue, j’aimerais renvoyer le contrôle à sa position initiale dans l’ordre Z.

Est-ce possible (de préférence de manière simple!)

27
g t

Appelez les méthodes GetChildIndex et SetChildIndex de la collection Controls du parent.

38
SLaks

Il n’existe pas d’ordre Z identique à VB, mais vous pouvez utiliser les méthodes GetChildIndex et SetChildIndex pour obtenir et définir leurs index manuellement. 

Ici il y a un exemple d'utilisation. Vous aurez probablement besoin de conserver un enregistrement de chaque index de contrôles afin de pouvoir le restaurer une fois terminé.

Quelque chose comme ceci est probablement ce que vous recherchez:

// 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);
23
w69rdy

Utilisé avec FlowLayoutPanel, cela déplacera un contrôle vers le haut ou le bas

    /// <summary>
    /// When used with the FlowLayoutPanel this will move a control up or down
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="UpDown"></param>
    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);
        }
    }
0
gVista