2015-07-14 3 views
0

У меня есть панель обновления, и мне нужно удалить все элементы управления, которые я динамически добавил, поэтому я могу повторно добавить их в AsyncPostBack. Каждый раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке: «Коллекция была изменена, операция перечисления не может выполняться». Ниже приведен код, который я использую, чтобы попытаться удалить LiteralControls; как только я выясню проблему, мне придется удалить другие типы. Кто-нибудь есть какие-либоДинамическое удаление элементов управления из панели обновления.

    foreach(Control xxl in UpdatePanel1.ContentTemplateContainer.Controls.OfType<Control>()) 
       { 
        Label2.Text = Label2.Text + xxl.GetType(); 

        foreach (LiteralControl lc in UpdatePanel1.ContentTemplateContainer.Controls.OfType<LiteralControl>()) 
        { 
        LiteralControl myLit = (LiteralControl)lc; 
        UpdatePanel1.ContentTemplateContainer.Controls.Remove(myLit); 
        UpdatePanel1.Update(); 
        } 
       } 
+3

Не делайте foreach, делайте a, с индексом и считайте назад –

+1

Если вы удалите элементы во время перечисления цикла, вы получите исключение. – Greg

ответ

1

Вы не можете изменять элементы с помощью foreach цикла, динамический контроль или нет.

Если вы хотите изменить предметы, вы должны использовать обычный цикл for.

Некоторые общие рекомендации заключаются в том, что использование динамических элементов управления является ТЯЖЕЛЫМ, и обычно рекомендуется избегать его любой ценой и использовать различные asp:Panel s для изменения содержимого путем переключения Visibility. Особенно с UpdatePanel, так как они, как правило, являются одними из самых тонких элементов управления, и то, что вы можете разместить внутри них, ограничено. Я понимаю, что «общий» совет вряд ли может быть применим к вашему конкретному проекту, сделайте все возможное.

+0

Как пропустить элементы управления на панели обновления в цикле for? К сожалению, это должно использовать AsyncPostBack, поэтому я использую элемент управления UpdatePanel :( –

+1

Я принимаю что-то вроде этого. Var myControl = (Control) UpdatePanel1.ContentTemplateContainer.Controls [i]; –

+0

@ChrisLombardi Да, вот так:) –

Смежные вопросы