Как я могу использовать цикл foreach, чтобы удалить все элементы управления на панели? - PullRequest
4 голосов
/ 22 октября 2009

Вот код, который у меня есть:

private void ClearSearchResults()
    {
        foreach (Control X in panel1.Controls)
        {
            panel1.Controls.Remove(X);
        }
    }

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

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

Что я могу сделать в этом случае?

Ответы [ 10 ]

16 голосов
/ 22 октября 2009

Как правило, вы не можете удалить из коллекции, повторяя сгенерированное из нее перечисление. Вместо использования foreach, типичным подходом является использование цикла for, работающего в обратном направлении:

private void ClearSearchResults()
{
    for(int i=panel1.Controls.Count-1;i>=0;--i) {
        panel1.Controls.RemoveAt(i);        
        // or
        // Control X = panel1.Controls[i];
        // panel1.Controls.Remove(X);
    }
}

Однако в этом случае просто используйте команду clear:

panel1.Controls.Clear();
14 голосов
/ 22 октября 2009

Это у вас работает?

private void ClearSearchResults()
{
    panel1.Controls.Clear();
}

Отредактировано, чтобы подчеркнуть комментарий CKret.

8 голосов
/ 22 октября 2009

Я полагаю, что вы меняете IEnumareble, когда вы удаляете элемент из него во время итерации.

Попробуйте использовать простой цикл for вместо foreach.

3 голосов
/ 22 октября 2009

Для начала не следует редактировать коллекцию IEnumerable в цикле foreach. Вы должны использовать цикл for или некоторое время.

т.е.

private void ClearSearchResults()
    {
        while (panel1.Controls.Count > 0)
        {
            panel1.Controls.RemoveAt(0);
        }
    }

или просто используйте:

 panel1.Controls.Clear();
2 голосов
/ 22 октября 2009

Может быть, это:

panel1.Controls.Clear()
1 голос
/ 22 октября 2009

Поскольку я не знаю, какую панель вы используете, вы обычно можете позвонить panel1.Controls.Clear

0 голосов
/ 03 декабря 2011
while (panel1.Controls.Count != 0)
{
    foreach (Control c in panel1.Controls)
    {
        panel1.Controls.Remove(c);
    }
}

Другой способ!

0 голосов
/ 22 октября 2009
            int n;
            n = panel1.Controls.Count-1;

            for (int i = 0; i <= n; i++ )
            {
                Control c = panel1.Controls[0];
                panel1.Controls.Remove(c);
            }
0 голосов
/ 22 октября 2009

На самом деле вы не можете использовать Remove, потому что он ломает итератор, поэтому простое решение будет выглядеть примерно так:

var controls = in c from panel1.Controls select c;
foreach(Controls _control in controls)
{
   panel1.Controls.Remove(_control);
}

но, конечно, вы не хотите придерживаться Loop, а затем используйте panel1.Controls.Clear()

0 голосов
/ 22 октября 2009
  private void ClearSearchResults()
        {
            foreach (Control X in panel1.Controls)
            {
                panel1.Controls.Remove(X);
            }
            if (panel1.Controls.Count > 0)
            { 
                ClearSearchResults();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...