Как сделать две формы открытыми друг друга в C#
Это своего рода упражнение новичка в создании двух форм, работающих друг с другом, хотя оно поднимает некоторые проблемы, не связанные с новичком.
Начинающие часто хотят, чтобы две формы (или более) открывали друг друга. К сожалению, это удивительно запутанно на C#.
Первый шаг заключается в том, чтобы понять, что каждая форма нуждается в некоторой переменной, которая относится к другой, чтобы она могла отобразить другую форму. Есть только несколько мест, которые вы могли бы поместить в эту переменную. Например, вы можете создать третий класс для хранения переменных, а затем дать переменным класса два для хранения ссылок на две формы. Вы даже можете сделать переменные static (shared), поэтому вам не нужно будет создавать экземпляр класса.
Этот подход работает и является удобным способом разрешить другим частям программы (включая две формы) обмениваться данными. В более общем плане это позволяет вам ограничить ограничение C# тем, что все данные и код должны быть в классе. Но некоторые считают, что это решение является неэлегантным.
Подход, который используется в этом примере, состоит в том, чтобы дать каждой из двух форм переменную, относящуюся к другой. Когда начинается основная форма, обработчик события Load инициализирует обе переменные.
Каждая из форм содержит кнопку, отображающую другую форму.
Следующий код показывает код второй формы.
// Переменная, которая ссылается на экземпляр Form2. // Обратите внимание, что это общедоступно. public Form1 TheForm1; // Переключитесь на TheForm1. private void btnForm1_Click(object sender, EventArgs e) { this.Hide(); TheForm1.Show(); }
Сначала код создает переменную с именем TheForm1 для хранения экземпляра класса Form1. Поскольку обработчик события первой формы Load инициализирует его, переменная должна быть объявлена public.
Когда вы нажимаете кнопку формы, код скрывает текущую форму. Обратите внимание, что это не уничтожает форму, она просто делает ее невидимой.
Затем код отображает первую форму, которая хранится в переменной TheForm1.
В следующем коде показан код первой формы.
// Переменная, которая ссылается на экземпляр Form2. private Form2 TheForm2; // Инициализация переменных формы. private void Form1_Load(object sender, EventArgs e) { // Создаем форму2. TheForm2 = new Form2(); // Инициализация переменной Form2. TheForm2.TheForm1 = this; // Сделайте обе формы на вершине. this.TopMost = true; TheForm2.TopMost = true; } // Переключитесь на Form2. private void btnForm2_Click(object sender, EventArgs e) { this.Hide(); TheForm2.Show(); }
Как и вторая форма, этот код имеет ссылку на другую форму. Поскольку эта форма является единственной, которая должна ссылаться на переменную TheForm2, объявляется private.
Когда форма загружается, обработчик события Load создает новый объект Form2 и сохраняет ссылку на него в переменной TheForm2. р>
Далее код инициализирует переменную TheForm1 новой формы, чтобы она указывала на текущую форму, имеет тип Form1. Теперь Form2 может вернуться к этому Form1.
Когда форма показывает друг друга, они иногда оказываются ниже других программ на рабочем столе. Чтобы предотвратить отбрасывание форм в обратную сторону, необычная особенность Windows, программа устанавливает оба свойства формы TopMost в true. Это держит их выше всех других не-верхних форм.
Когда пользователь нажимает кнопку первой формы, обработчик события Click скрывает текущую форму и отображает другую форму.
Это основной подход, но есть еще одна важная проблема. По умолчанию начальная форма, которая изначально Form1, играет важную роль в программе C#. Когда эта форма уничтожается, программа заканчивается. В этом примере, если вы нажмете форму запуска, форма запуска скрывает и отображает вторую форму. Теперь, если вы закрываете вторую форму, вторая форма исчезает, но форма запуска все еще скрыта. Это означает, что нет возможности закончить программу. Он сидит там на заднем плане, как зомби, тратящие ресурсы.
Существует несколько подходов. Два самых простых и самых очевидных - закрыть первую форму и предотвратить вторую закрытие. Для обоих подходов вы добавляете обработчик события Form_Closing во вторую форму.
Чтобы закрыть первую форму при закрытии второй формы, просто сделайте обработчик события Form_Closing закрытием второй формы, как в следующем коде.
private void Form2_FormClosing(object sender, FormClosingEventArgs e) { // Подход 1: Закройте форму запуска. TheForm1.Close(); }
Теперь, когда вторая форма закрывается, она также закрывает первую (стартовую) форму, поэтому программа заканчивается.
Для второго подхода make обработчик события Form_Closing установил для параметра e.Cancel значение e.Cancel для предотвращения закрытия второй формы. Затем скройте его и покажите стартовую форму, как и раньше. Следующий код показывает этот подход.
private void Form2_FormClosing(object sender, FormClosingEventArgs e) { // Подход 2: скрыть эту форму, а не закрывать ее. this.Hide(); TheForm1.Show(); e.Cancel = true; }
В любом случае пользователь не может закрыть вторую форму, не закрывая форму запуска, так что вы не получите программу зомби.