Как я могу использовать цикл foreach для удаления всех элементов управления на панели?
Вопрос
Вот код, который у меня есть:
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);
}
}
Другой способ!