foreach (var control in MainPanel.Controls
.Where(c => c is PictureBox) || c is TextBox)
{
MainPanel.Controls.Remove(control);
}
Это удалит каждый элемент типов, PictureBox
и TextBox
.Конечно, проблема с этим кодом заключается в том, что вы изменяете коллекцию при ее перечислении.
Одним из подходов к решению этой проблемы может быть создание коллекции элементов управления для удаления сначала
var controls = MainPanel.Controls.Where(c => c is PictureBox || c is TextBox).ToList();
, а затем перечисление этой коллекции с удалением каждого элемента из Panel.
foreach (var toRemove in controls)
MainPanel.Controls.Remove(toRemove);
Также было бы полезно убедиться, что элемент удален из пользовательского интерфейса в правильном потоке
delegate void RemoveControlDelegate(Control controlToRemove);
private void RemoveControl(Control control)
{
if (InvokeRequired)
{
BeginInvoke(new RemoveControlDelegate(RemoveControl), control);
}
else
{
MainPanel.Controls.Remove(control);
}
}
foreach (var toRemove in controls)
RemoveControl(toRemove);