Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с кодом на C#

А/Г Ученик (119), открыт 3 недели назад
Мне нужно сделать, чтобы при нажатии кнопки(button1) закрылась определённая форма(Form3), после которой закрываются остальные формы, после этого нужно чтоб открылась 1 форма(Form1)

Код я уже написал, но я не понимаю в чём именно ошибка, выводит это:

Вот код:
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();
}
2 ответа
Роман Сидоров Профи (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();
}
```

Эти изменения должны помочь вам добиться нужного поведения.
А/ГУченик (119) 3 недели назад
нейросеть?
Роман СидоровПрофи (505) 3 недели назад
Я че еблаn
А/ГУченик (119) 3 недели назад
видно же :)
А/ГУченик (119) 3 недели назад
тоже самое

Jurijus Zaksas Искусственный Интеллект (445688) 3 недели назад
Application.OpenForms является коллекцией
К коллекции применима операция перечисления элементов, которой и пользуется цикл foreach.
Когда ты закрываешь форму, она исчезает из Application.OpenForms
И из-за этого операция перечисления не может быть продолжена.
И усе.

Просто скопируй предварительно все формы, которые хочешь закрыть, в другое место:

var FormsToClose = Application.OpenForms.Where(x => x!=this).ToList();

И уже их закрывай.

Имей ввиду такой тонкий момент, что если ты закроешь главную форму, твоя программа закончится. Возможно, имеет смысл ее прятать, а не закрывать.
Похожие вопросы