переходы между формами c
Как открыть и закрыть форму из другой формы в C# (правильное решение)

C# изучаю не так давно и встала передо мной недавно задача:
— открыть Form2 при нажатии на кнопку в Form1;
— спрятать Form1;
— открыть Form1 при закрытии Form2.
На первый взгляд задача показалась элементарной, но… возникли нюансы — при закрытии приложения оно не выгружалось и в диспетчере задач мы наблюдали его работу, хотя визуально оно как бы закрылось.
В чём же причина такого поведения? Об этом расскажу дальше. Рассмотрим открытие и закрытие форм на примерах.
Открываем и закрываем форму из другой формы
У нас в приложении есть две формы Form1 — главная, которая открывается сразу при запуске приложения и Form2, которую открываем по нажатию на кнопку.
Чтобы открыть Form2 нам необходим следующий код, который будет срабатывать при нажатии на кнопку:
Теперь у нас открылась Form2 и спряталась Form1. Поработав с Form2 мы её закрываем и при этом нам надо после этого отобразить Form1. Многие начинающие, включая меня начинают писать следующий код, который помещаем в событие, которое происходит после закрытия Form2:
Вроде всё логично: Form2 закрылась, Form1 открылась. Однако используя этот метод, мы можем заметить, что после того как мы закрываем приложение оно продолжает висеть в памяти. Многие, не зная почему это происходит дописывают в метод «Form1_FormClosed» дописывают принудительное закрытие приложения:
Это работает, однако правильно ли это? Решать вам.
А теперь ответим на вопрос «почему приложение висит в памяти» и рассмотрим простое и правильное решение.
Первая часть кода: мы отображаем Form2 и скрываем Form1. Не закрываем, а именно скрываем, т.е. экземпляр Form1 продолжает существовать.
Закрыть Form1 вместо скрытия не получится, так как это главная форма приложения и при её закрытии мы закроем всё приложение.
Вторая часть кода: строкой «Form ifrm = new Form1();» мы создаём второй экземпляр Form1 и далее его и отображаем, а первый экземпляр Form1 продолжает жить в памяти. И когда мы закрываем приложение (Form1), то первый экземпляр при этом не закрываем он так и «сидит» в памяти, поэтому приложение не выгружается из памяти. В связи с этим многие и закрывают принудительно приложение при закрытии главной формы (Form1).
Сейчас мы с вами рассмотрим правильный код, который не будет создавать второй экземпляр Form1 и отображать его, а будет отображать скрытую до этого Form1.
OpenForms — получает коллекцию открытых форм приложения. В нашем случае мы сразу обратились к главной форме приложения (OpenForms[0]).
Теперь при закрытии Form2 у нас будет вызываться и отображаться та форма, которая породила закрывающуюся.
Учитываем координаты форм при открытии
Form ifrm = new Form2();
ifrm.ShowDialog();
Это правильное решение, которое всегда будет открывать Form2 поверх Form1 и всегда по центру Form1. Однако этот код не применим, если вам надо скрывать Form1, так как Form1 не будет скрываться.
Сейчас приведу полное решение, которое позволит открывать Form1 и Form2 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):
Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.
Открываем форму поверх другой формы, как модальное окно
Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:
В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.
Переключение между формами

У меня есть две формы.С первой формы переключаюсь на вторую, мне нужно сделать так, чтобы первая.

Что нужно прописать, для того, чтобы приоткрытии пользователем второй формы, закрывалась первая.
Добавлено через 4 минуты
Попробую создать мастер по вашему примеру.
Добавлено через 1 час 46 минут
выдает ошибку
‘WindowsFormsApplication1.Form7.Dispose(bool)’: no suitable method found to override
Добавлено через 2 часа 9 минут
Ошибку уже не выдает.
Но я сейчас себе просто мозг сломаю.
Не хочет переключатся между панелями.
Не пойму как эти слои(панели) должны быть построены чтоб между ними нормально переключалось?
Просто чуть сдвинул границу панели заработало, до этого тупо не переключало на следующий слой, как буд то его нету.
Скорее всего у меня не выводило следующий слой так как он шел не в том порядке, мне надо было выводить слои 1,2,3 а они лежали 3,2,1 (3 сверху был). Поставив при событии загрузки формы panel1.BringToFront(); не помогло (не пойму почему). В общем вручную расположил слои в правильном порядке и на каждом клацнул «Bring To Front».
Переход между формами
Правильный переход между формами
Опишу суть проблемы: есть 4 формы, на каждой есть кнопки «вперед» и «назад», переход между формами.
Обычный переход между формами
Я только недавно начал изучать c# и программирование в целом. Интересует такой вопрос, а переход.
Переход между двумя формами
Добрый день! Скажите пожалуйста.,как можно осуществить переход между двумя формами через comboBox?
А если в program.cs похимичить? Условие какое-либо добавить(или цикл пока) чтобы только при выполнении него первая форма закрылась и открылась вторая?
передаем ссылку на нее во вторую форму и вызвываем form1.Close() при закрытии второй формы (или последней сторонней формы)
koc94ok, ну у меня слов нет 
koc94ok, так он есть локальной переменной и извне не видим.
Как реализовать переход между формами?
Нашёл лишь такую реализацию перехода меж формами, но она далеко не лучшая, т.к. моё приложение не.
Переход и передача данных между формами
как передать данные из одной формы в другую в c# нужно чтобы информация про прямоугольник из первой.

Подскажите как сделать так что при нажатии на ЛКМ и движении курсора в лево открылась другая форма.
Переключиться с одной формы на другую
Приветствую всех, хотел сделать что то на подобии регистрации и авторизации на C++, но возникла проблема с переключением между форм. Т.е я никак не могу переключиться с одной формы на другую. Искал на форуме решения, для меня ничего не нашел.
Но получаю следующую ошибку: error C3673: ‘My123::Form2’ : class does not have a copy-constructor
Надеюсь на вашу помощь. Спасибо.
Вызов из одной формы другую.
Всем привет не подскажите как вызвать из Form1 Form2, точнее из Form1 получается вызывать Form2, а.
Переключение с одной формы на другую
У меня есть 2 формы. Изначально при создании проекта была создана форма №2(в этой форме код.

подскажите как зделаь переход с одной формы на другую методом нажатия на клавишу button
По моему ты написал не в тот раздел, но может помогу:
Здесь оператор требует наличия конструктора копирования в классе Form2. Вот и добавь его:
Добавлено через 1 час 50 минут
По поводу класса всё верно, но как то по-другому его нужно создать.
Решение
Я не точно понял в чём вопрос, но думаю да.
Честно говоря не понял как сделать
Добавлено через 17 минут
Если удалить переключение у одной формы и сделать только для второй, то работает отлично, а на обеих не хочет работать.
Изначально имена пространств были одинаковыми, вы мне посоветовали сменить их, поставить разными, я так и сделал, но это не помогло, сейчас вернул в исходное положение. Дело в том, что к примеру если я в первой форме сделаю #include «Form2.h» и в первой форме сделаю по кнопке переход на вторую форму всё работает на отлично, но как только я делаю во второй форме #include «Form1.h» чтобы и в ней сделать переход, но уже на первую форму, то появляются ошибки:
Form2′ : undeclared identifier
‘f’ : undeclared identifier
left of ‘->ShowDialog’ must point to class/struct/union/generic type
syntax error : identifier ‘Form2’
Я попробовал из первой формы, сделать два перехода, переход на вторую форму и третью, это тоже сработало отлично, но если ввести в третьей форме #include «Form1.h», то снова появляются ошибки.
Нельзя обойтись как то без include и так переходить с одной на другую ну или в чем ошибка не пойму.
Как переключаться между формами, не создавая новый экземпляр форм?
В моем приложении у меня есть четыре формы form1 form2 form3 form4. и каждая форма имеет две кнопки, то есть следующие и предыдущие кнопки для переключения между формами. и мой вопрос: как я могу переключаться между формами, не создавая новый экземпляр форм? ниже мой код
8 ответов
Поскольку вы обращаетесь к своим формам последовательно, просто убедитесь, что вы используете метод Show, который назначает владельца созданной форме и назначает его переменной уровня класса после ее создания. Что-то вроде этого должно сработать для вас.
Просто удалите this.hide() в первой форме и [formNameHere].show(); во второй форме.
И т. д. не очень хорошо объяснять, и на самом деле с C #. Но это должно сработать.
Я была такая же проблема. Мне нужно было приложение с множеством форм, и мне нужно было переключаться между формами вперед и назад без потери данных. Я придумал следующее решение, и оно сработало для меня.
В основном файле (Program.cs) напишите следующие два класса:
Первый класс используется для глобальных переменных, которые можно использовать в формах. Вы можете получить доступ к любой переменной:
Это работает гладко и идеально подходит для меня. Попытайся.
Похоже, вы пытаетесь реализовать функцию мастера. Я бы рекомендовал иметь единую форму. Затем добавьте к нему настраиваемый элемент управления вкладками. Добавьте кнопки в форму, которая перемещается вперед и назад.
Чтобы настроить управление вкладками, вам нужно сделать следующее:
Этот элемент управления вкладками будет отображать только одну вкладку за раз. Хотя, во время разработки вы их все можете увидеть. Добавьте это и кнопки в свою форму. При нажатии кнопки просто установите свойство SelectedIndex этого элемента управления вкладкой.
Эта функция может использоваться, чтобы узнать, открыта ли форма уже или нет.
И в вашем случае
В every forms constructor() создать следующий и предыдущий объект формы
И при нажатии кнопки вызывается IsFormAlreadyOpen (), чтобы узнать, открыта ли форма уже или нет, и если она уже открыта, просто выведите эту форму на передний план, иначе отобразите форму с помощью метода obj.show () и скрыть или закрыть родительскую форму

