C #: Хороший способ найти следующий и предыдущий элемент управления - PullRequest
2 голосов
/ 01 сентября 2009

Какой хороший способ найти следующих и предыдущих братьев и сестер элемента управления?

Например, если у вас есть панель с несколькими кнопками, текстовыми полями и т. Д. Где-то среди них у вас есть пользовательский элемент управления, который состоит из текстового поля и кнопки. При нажатии кнопки вы, например, хотите найти имя элемента управления, который следует за этим элементом управления пользователя.

Моя цель - создать пользовательский элемент управления, который может поменять свою позицию с тем, что находится до или после него (если они есть, конечно).

Я знаю, что это должно быть тривиально, но я просто не могу обернуться вокруг этого ... = /

Ответы [ 5 ]

1 голос
/ 01 сентября 2009

Это решение довольно специфично для случая FlowLayoutPanel. Поскольку он размещает элементы управления в том порядке, в котором они отображаются в коллекции элементов управления, задача, конечно, состоит в том, чтобы выяснить индексы элементов управления, которые должны поменяться местами, и переключить их:

private enum Direction
{
    Next,
    Previous
}

private void SwapLocations(Control current, Direction direction)
{
    if (current == null)
    {
        throw new ArgumentNullException("current");
    }
    // get the parent
    Control parent = current.Parent;
    // forward or backward?
    bool forward = direction == Direction.Next;
    // get the next control in the given direction
    Control next = parent.GetNextControl(current, forward);
    if (next == null)
    {
        // we get here, at the "end" in the given direction; we want to
        // go to the other "end"
        next = current;
        while (parent.GetNextControl(next, !forward) != null)
        {
            next = parent.GetNextControl(next, !forward);
        }
    }
    // get the indices for the current and next controls
    int nextIndex = parent.Controls.IndexOf(next);
    int currentIndex = parent.Controls.IndexOf(current);

    // swap the indices
    parent.Controls.SetChildIndex(current, nextIndex);
    parent.Controls.SetChildIndex(next, currentIndex);
}

Пример использования:

private void Button_Click(object sender, EventArgs e)
{
    SwapLocations(sender as Control, Direction.Next);
}
1 голос
/ 01 сентября 2009

Похоже, что вы можете вызвать Controls.GetChildIndex (control) со своим текущим элементом управления, чтобы получить его индекс, а затем просто проиндексировать коллекцию Controls, чтобы получить предыдущего и следующего родных элементов.

0 голосов
/ 12 июля 2018

Для получения следующего контроля над parrent:

Panel.GetNextControl (currentControl, true);

Для получения предыдущего контроля над parrent:

Panel.GetNextControl (currentControl, false);

0 голосов
/ 02 февраля 2012
this.Controls.SetChildIndex(panelContainerOfHeaderAndUserControl1, 0);
this.Controls.SetChildIndex(panelContainerOfHeaderAndUserControl, 1);

Это сработало для меня. У меня есть две панели, созданные во время выполнения, но одна со стилем заливки, а другая сверху. Панель со стилем заливки перекрывается верхней.

Установка порядка элементов в элементе управления исправляет это.

0 голосов
/ 01 сентября 2009
this.GetNextControl(Control,bool forward);

Извлекает следующий элемент управления вперед или назад в порядке перехода дочерних элементов управления.

EDIT:

Использование коллекции Controls и ее методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...