Удаление элементов управления программно НЕ работает, как ожидалось! - PullRequest
2 голосов
/ 29 июня 2009

Привет!
У меня есть 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 панелей) while () повторяется 4 раза, чтобы удалить все панели.

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

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

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

1 Ответ

5 голосов
/ 29 июня 2009

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

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