Удаление элементов управления программно НЕ работает, как ожидалось!

2

Привет!
У меня есть 11 панелей на каждой вкладке tabcontrol и вы хотите удалить 10 панелей. поэтому я написал этот код:

        var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>()
            .Where(p => !p.Name.StartsWith("BasePanel"));
        foreach (var pnl in PnlsToRemove)
            pnl.Dispose();

но после отслеживания я задался вопросом, что удаление заказа чередуется!!!
означает, что, когда над кодом работает только панели 0,2,4,6,8,10, удаляется, а остальные остаются.
поэтому я должен поместить мой код в цикл, чтобы поочередно удалять панели:

    while (tabControl.SelectedTab.Controls.OfType<Panel>().Count() != 1)
    {
        var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>()
            .Where(p => !p.Name.StartsWith("BasePanel"));
        foreach (var pnl in PnlsToRemove)
            pnl.Dispose();
    }

в этом случае (для 10 панелей), в то время как() петли 4 раза, чтобы удалить все панели.

ИЗВЕЩЕНИЕ: все мои панели существуют в "PnlsToRemove", и эта ошибка возникает при выполнении "PnlsToRemove" в foreach.

Итак, что случилось с моим кодом???
Почему foreach() перескакивает со следующей панели???

Я думаю, что все ясно!

Теги:
c#-3.0

1 ответ

5
Лучший ответ

Основная коллекция мутируется при удалении панелей из списка, и это, по-видимому, отражается в значениях, которые видит "foreach". Решение состоит в том, чтобы хранить значения в новой коллекции и перебирать их. Вы должны сделать это, добавив ".ToList()" к вашему определению PnlsToRemove

  • 0
    Я использовал .ToList <Panel> () по вашему совету. и это сработало хорошо. но я не понял, в чем проблема? Означает, что почему "меняют, когда я удаляю панели из списка"?
  • 2
    Многие методы LINQ приводят к ленивой оценке, а это значит, что они не будут делать копию основного перечисления, если не будут этого делать. Представьте, что у вас есть массив, и вместо того, чтобы копировать его, вы просто запоминаете индекс. Операция «получить следующий элемент» будет увеличивать индекс и возвращать следующее значение из массива. Начнем с нулевого элемента. Возвращается, а индекс обновляется до единицы. Но теперь вы удаляете нулевой элемент из массива, так что в настоящее время индексом один является то, что раньше было индексом два. и т.п.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню