Роман Сидоров
Профи
(505)
3 недели назад
В вашем коде есть несколько проблем, связанных с порядком закрытия форм и открытием новой формы. Когда вы вызываете `this.Close()`, текущая форма закрывается, и управление возвращается в вызвавший метод, что может привести к неожиданному поведению. Вот как можно исправить код:
```csharp
private void button1_Click(object sender, EventArgs e)
{
// Закрываем текущую форму (Form3)
this.Hide(); // Используем Hide вместо Close
// Закрываем остальные открытые формы
foreach (Form form in Application.OpenForms)
{
if (form != this)
{
form.Close();
}
}
// Открываем Form1
Form1 form1 = new Form1();
form1.Show();
// Закрываем текущую форму после открытия Form1
this.Close();
}
```
### Объяснение изменений:
1. **Hide вместо Close**: Мы используем `this.Hide()` вместо `this.Close()`, чтобы скрыть форму, а не закрывать её. Это позволяет завершить цикл по открытым формам до того, как текущая форма будет окончательно закрыта.
2. **Порядок закрытия**: Закрытие текущей формы (`this.Close()`) происходит после открытия `Form1`, что предотвращает возможные ошибки при попытке взаимодействовать с закрытой формой.
### Альтернативный подход:
Если вы хотите полностью закрыть все формы и открыть `Form1`, вы можете использовать метод `Application.Exit()` для завершения приложения, а затем открыть новую форму:
```csharp
private void button1_Click(object sender, EventArgs e)
{
// Закрываем остальные формы
foreach (Form form in Application.OpenForms)
{
form.Close();
}
// Открываем Form1
Form1 form1 = new Form1();
form1.Show();
// Закрываем текущую форму
this.Close();
}
```
Эти изменения должны помочь вам добиться нужного поведения.
Jurijus Zaksas
Искусственный Интеллект
(445688)
3 недели назад
Application.OpenForms является коллекцией
К коллекции применима операция перечисления элементов, которой и пользуется цикл foreach.
Когда ты закрываешь форму, она исчезает из Application.OpenForms
И из-за этого операция перечисления не может быть продолжена.
И усе.
Просто скопируй предварительно все формы, которые хочешь закрыть, в другое место:
var FormsToClose = Application.OpenForms.Where(x => x!=this).ToList();
И уже их закрывай.
Имей ввиду такой тонкий момент, что если ты закроешь главную форму, твоя программа закончится. Возможно, имеет смысл ее прятать, а не закрывать.
Код я уже написал, но я не понимаю в чём именно ошибка, выводит это:
Вот код:
private void button1_Click(object sender, EventArgs e)
{
this.Close();
foreach (Form form in Application.OpenForms)
{
if (form != this)
{
form.Close();
}
}
Form1 form1 = new Form1();
form1.Show();
}