Как установить Z-порядок элемента управления с помощью WinForms - PullRequest
29 голосов
/ 09 июля 2010

Я пишу пользовательский TextBox, который при получении фокуса меняет свой стиль рамки.

Поскольку при добавлении границы элемент управления перекрывается с соседними, я временно переношу текстовое поле в начало диалога (используя textBox.BringToFront()).

Однако после завершения редактирования и потери фокуса я бы хотел вернуть элемент управления в исходное положение в Z-порядке.

Возможно ли это (желательно простым способом!)

Ответы [ 3 ]

38 голосов
/ 09 июля 2010

Вызовите GetChildIndex и SetChildIndex методов родительской коллекции Controls.

26 голосов
/ 09 июля 2010

Z-порядка не существует, как в VB, но вы можете использовать методы GetChildIndex и SetChildIndex, чтобы вручную получить и установить их индексы.

Здесь есть пример того, как его использовать.Вам, вероятно, нужно будет вести учет каждого индекса управления, хотя вы можете установить его обратно, когда закончите.

Возможно, вам нужно что-то подобное:

// 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);
0 голосов
/ 04 апреля 2018

При использовании с FlowLayoutPanel это будет перемещать элемент управления вверх или вниз

    /// <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);
        }
    }
...