Это не работает, потому что вы забыли вызвать form2.Show () в предложении else. Код неправильный, вы не хотите создавать новый экземпляр Form2, если он уже существует. Кроме того, в Winforms есть ошибка, из-за которой Application.OpenForms теряет отслеживание экземпляров форм.
Лучше всего явно следить за временем жизни формы с помощью обработчика событий FormClosed, чтобы вам не пришлось искать его позже:
Form2 form2;
private void showForm2() {
if (form2 == null) {
form2 = new Form2();
form2.FormClosed += delegate { form2 = null; };
}
form2.Show();
form2.Focus();
}
Вызовите showForm2 из ваших обработчиков событий.