Как я могу использовать цикл foreach для удаления всех элементов управления на панели?

StackOverflow https://stackoverflow.com/questions/1607983

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Это работает для вас?

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

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

Другие советы

Как правило, вы не можете удалить из коллекции, повторяя сгенерированное из нее перечисление. Вместо использования 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();

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

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

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

То есть.

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

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

 panel1.Controls.Clear();

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

panel1.Controls.Clear()

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

  private void ClearSearchResults()
        {
            foreach (Control X in panel1.Controls)
            {
                panel1.Controls.Remove(X);
            }
            if (panel1.Controls.Count > 0)
            { 
                ClearSearchResults();
            }
        }
            int n;
            n = panel1.Controls.Count-1;

            for (int i = 0; i <= n; i++ )
            {
                Control c = panel1.Controls[0];
                panel1.Controls.Remove(c);
            }

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

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

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

while (panel1.Controls.Count != 0)
{
    foreach (Control c in panel1.Controls)
    {
        panel1.Controls.Remove(c);
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top