Sinisa Janjetovic Ответов: 3

Закройте текущую форму, откройте новую форму и вернитесь к предыдущей форме


Я хочу нажать на кнопку и перейти к форме 2, а затем закрыть текущую форму 1. Когда я закончу работу над формой 2, я хочу нажать на кнопку возврата и вернуться к форме 1.

Что я уже пробовал:

Код в кнопке из Form1 -> Form2

Формы Form2 форме Form2 = новые формы Form2();
этот.Скрыть();
формы Form2.Показать()


Code in button from Form2 -> Form1

Form1 form1 = new Form1();
this.Hide();
form1.Show()


Я получаю сообщение об ошибке:
Цитата:
Система.ArgumentException: "элемент с тем же ключом уже добавлен".


Я использую класс посредника

Maciej Los

WinForm или WPF?

3 Ответов

Рейтинг:
1

AnotherKen

Если вы продолжаете переключаться между окнами, то вы получите эту ошибку, если попытаетесь повторно создать экземпляр form1 или form2, когда для него уже есть экземпляр объекта. Я склонен преодолевать это, чтобы проверить, существует ли объект уже, прежде чем пытаться создать новый.


Sinisa Janjetovic

Спасибо, я тоже так предполагал, но как решить этот вопрос?

AnotherKen

Я обычно использую булеву переменную для хранения состояния существования объекта. Поэтому я бы сделал что-то вроде:

если !form1Exists
{
Форма form1 форма form1 = новые формы form1();
form1Exists = TRUE;
}

Я бы объявил булеву переменную form1Exists и, вероятно, form2Exists также глобальными переменными, чтобы мне не пришлось беспокоиться о потере значения, если процедура, которая его устанавливает, выходит за пределы области видимости.

Я бы также установил это значение в false, если бы знал, что форма закрыта.

Рейтинг:
1

Maciej Los

Примечание: Form1 остается скрытым, но не закрытым.

WinForm:


Вы можете проверить, открыта ли форма 1 уже с помощью Приложение.Свойство OpenForms (System.Окна.Формы) | Microsoft Docs[^]

Form frm = Application.OpenForms["Form1"]; //it should works
frm.Show();


Примечание: пожалуйста, прочитайте внимательно Security раздел.

WPF:


Там есть коллекция: Application.Current.Windows
Application.Current.Windows.OfType<Window>().Where(x => x.Name == "Form1").FirstOrDefault()


Рейтинг:
0

Member 14511434

//попробуй this...it должно работать просто отлично


//из формы 1 -> форма 2

это.скрыть();
Формы Form2 форме Form2=новые формы Form2();
формы Form2.Показать();


//из формы 2 -> Форма 1

это.скрыть();
Форма form1 форма form1=новые формы form1();
форма 1.показать();


Richard MacCutchan

Вы создаете новый объект Form1 вместо того, чтобы вернуться к исходному.