Как изменить последовательности цикла при использовании оператора foreach для зацикливания элементов управления winform - PullRequest
1 голос
/ 29 ноября 2011

Я использую Foreach для зацикливания всех элементов управления в выигрышной форме. Однако Foreach всегда размещает элементы управления в алфавитном порядке.

Я попытался установить индекс вкладки, а также изменить последовательность кода элементов управления. Тем не менее, цикл по-прежнему в алфавитном порядке.

Есть ли какие-нибудь методы для зацикливания элементов управления в winform с определенным порядком?

Ответы [ 2 ]

4 голосов
/ 29 ноября 2011

Используя метод расширения LINQ ">.OrderBy() (и сопутствующий ">.OrderByDescending()), вы можете использовать любой заказ по вашему желанию.

Но поскольку Controls не является универсальной коллекцией, вам необходимо сначала преобразовать ее в универсальный вариант. Это можно сделать с помощью ">.OfType<T>() (фильтры) или ">.Cast<T>() (приведение).

foreach (var c in Controls.OfType<Control>().OrderBy(c => c.Size.Top))
{
    // ...
}

Если вам нужно изменить коллекцию по ходу, вы можете использовать ">.ToList(), чтобы сделать снимок.

foreach (var c in Controls.OfType<Control>().OrderBy(c => c.Size.Top).ToList())
{
    // ...
}

Вам потребуется импортировать пространство имен LINQ, чтобы включить методы extension.

using System.Linq;
0 голосов
/ 29 ноября 2011

foreach выполняет итерацию по списку элементов управления. Этот список "не отсортирован", поэтому вам нужно его отсортировать.

Если вам нужна определенная сортировка, я бы скопировал список в словарь, ключом которого является свойство, для которого вы сортируете.

Вот небольшой фиктивный код, который может объяснить, что я имел в виду.

Dictionary<int, IControl> controls = new Dictionary<int, IControl>();

foreach(IControl control in form.Controls){
    int tabIndex = control.TabIndex;
    controls.add(tabIndex, control);
}

controls.Sort();

foreach(IKeyValuePair<int, IControl> control controls){
    control.DoSome();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...