Переход между окнами windows form c

Переход между формами C# Решение и ответ на вопрос 176415

koc94ok

13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

1

Переход между формами

14.10.2010, 18:32. Показов 122773. Ответов 30

Метки нет (Все метки)


Нажатием на клавишу закрыть текущую форму(Form1) и открыть новую(Form2)

C#
1
2
3
4
        private void button1_Click(object sender, EventArgs e)
{
....
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

14.10.2010, 18:32

Ответы с готовыми решениями:

Переход между формами
Здравствуйте! У меня возникла такая ошибка… Есть код открытия формы при нажатии на кнопку …

Правильный переход между формами
Опишу суть проблемы: есть 4 формы, на каждой есть кнопки "вперед" и "назад", переход между формами…

Обычный переход между формами
Я только недавно начал изучать c# и программирование в целом. Интересует такой вопрос, а переход…

Переход между двумя формами
Добрый день!
Скажите пожалуйста.,как можно осуществить переход между двумя формами через comboBox?

30

free6878

9 / 9 / 1

Регистрация: 01.09.2010

Сообщений: 182

14.10.2010, 18:53

2

C#
1
2
3
4
5
6
7
private void button1_Click(object sender, EventArgs e)
        {
           
                Form2 frm = new Form2();
                frm.Show();
                Close();
        }

Вот как-то так!?



2



koc94ok

13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

14.10.2010, 19:43

 [ТС]

3

Цитата
Сообщение от free6878
Посмотреть сообщение

C#
1
2
3
4
5
6
7
private void button1_Click(object sender, EventArgs e)
        {
           
                Form2 frm = new Form2();
                frm.Show();
                Close();
        }

Вот как-то так!?

вторая форма появляется и тут же закрывается, нет не так к сожалению



0



CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

14.10.2010, 20:41

4

Цитата
Сообщение от koc94ok
Посмотреть сообщение

вторая форма появляется и тут же закрывается, нет не так к сожалению

это потому что у вас первая форма является главной в приложении — при ее закрытии программа завершается. Чтоб скрыть можно вызвать метод Hide(), только потом не забудьте убить форму



1



13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

14.10.2010, 20:52

 [ТС]

5

Цитата
Сообщение от Alligieri
Посмотреть сообщение

это потому что у вас первая форма является главной в приложении — при ее закрытии программа завершается. Чтоб скрыть можно вызвать метод Hide(), только потом не забудьте убить форму

А если в program.cs похимичить? Условие какое-либо добавить(или цикл пока) чтобы только при выполнении него первая форма закрылась и открылась вторая?

зы как убить первую форму?



0



CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

14.10.2010, 21:00

6

Цитата
Сообщение от koc94ok
Посмотреть сообщение

А если в program.cs похимичить?

Не стоит

Цитата
Сообщение от koc94ok
Посмотреть сообщение

Условие какое-либо добавить(или цикл пока) чтобы только при выполнении него первая форма закрыталась и открылась вторая?

думаю плохо будет

Цитата
Сообщение от koc94ok
Посмотреть сообщение

зы как убить первую форму?

передаем ссылку на нее во вторую форму и вызвываем form1.Close() при закрытии второй формы (или последней сторонней формы)



0



13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

14.10.2010, 21:05

 [ТС]

7

Цитата
Сообщение от Alligieri
Посмотреть сообщение

Не стоит

думаю плохо будет

передаем ссылку на нее во вторую форму и вызвываем form1.Close() при закрытии второй формы (или последней сторонней формы)

ясно, а как ссылку передать?



0



CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

14.10.2010, 21:32

8



0



koc94ok

13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

14.10.2010, 23:04

 [ТС]

9

делаю так:

C#
1
2
3
4
5
6
7
8
9
10
public Form2(Form1 f1)
{
    InitializeComponent();    
 
    //Обрабатываем данные
}
private void button1_Click(object sender, EventArgs e)
        {
            Form1.Close(); //f1.Close(); тоже ошибка
        }

и так

C#
1
2
Form2 f = new Form2(this);
f.ShowDialog();

результат — ошибка…



0



Alligieri

CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

15.10.2010, 01:16

10

koc94ok, ну у меня слов нет вы ж программистом хотите быть вроде?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public Form2(Form1 f1)
{
    InitializeComponent();    
 this.f1=f1;
    //Обрабатываем данные
}
 
private Form1 f1;
 
private void button1_Click(object sender, EventArgs e)
        {
            f1.Close(); 
        }

Добавлено через 54 секунды
и запомните «рецепт успеха» — внимательно, вдумчиво, дооолго «курим» мануалы



1



koc94ok

13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

15.10.2010, 08:34

 [ТС]

11

Нашел в инете еще такой способ:

C#
1
2
3
4
            Form1.ActiveForm.Hide();
            Form2 MyForm2 = new Form2();
            MyForm2.ShowDialog();
            Close();

Вроде тоже работает



3



CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

15.10.2010, 10:20

12

koc94ok, ну при ShowDialog() — да, поскольку цикл обработки не выходит за пределы Form2 пока она не закрыта



0



13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

15.10.2010, 10:42

 [ТС]

13

Мммм, а как передать CookieContainer скажем?



0



CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

15.10.2010, 11:04

14

koc94ok, вы явно не читаете те ссылки что я вам даю в 7 ЧаВо по формам все прекрасно описано. Способов есть несколько, но я чаще всего передаю в конструктор и потом сохраняю в приватное поле



0



koc94ok

13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

15.10.2010, 11:13

 [ТС]

15

Цитата
Сообщение от Alligieri
Посмотреть сообщение

koc94ok, вы явно не читаете те ссылки что я вам даю в 7 ЧаВо по формам все прекрасно описано. Способов есть несколько, но я чаще всего передаю в конструктор и потом сохраняю в приватное поле

читал и делал как там сказано
Form2

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public Form2(Form1 f1, string data)
        {
            InitializeComponent();
            this.f1 = f1;
            this.data = data;
 
            //Обрабатываем данные
        }
        string data;
        private Form1 f1;
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            f1.Close();
        }

form1

C#
1
2
3
            this.Hide();
            Form2 f = new Form2(this.cooookies);
            f.ShowDialog();

ошибки почти везде



0



CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

15.10.2010, 11:43

16

Цитата
Сообщение от koc94ok
Посмотреть сообщение

public Form2(Form1 f1, string data)

сколько принимает параметров? а тут —

Цитата
Сообщение от koc94ok
Посмотреть сообщение

Form2 f = new Form2(this.cooookies);

?



0



koc94ok

13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

15.10.2010, 12:07

 [ТС]

17

форм1:

C#
1
2
3
            this.Hide();
            Form2 f = new Form2(this, this.nnc);
            f.ShowDialog();

форм2:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public Form2(Form1 f1, Form1 nn)
        {
            InitializeComponent();
            this.f1 = f1;
            this.nn = nn;
 
            //Обрабатываем данные
        }
        CookieContainer nnc;
        private Form1 f1;
        private Form1 nn;
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            f1.Close();
        }

осталась одна ошибка:
Ошибка 1 «Form1» не содержит определения для «nnc» и не был найден метод расширения «nnc», принимающий тип «Form1» в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) Form1.cs



0



CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

15.10.2010, 12:13

18

Цитата
Сообщение от koc94ok
Посмотреть сообщение

this.nnc

не обьявлен в зоне видимости данного кода, определите как приватное поле



0



koc94ok

13 / 13 / 2

Регистрация: 22.04.2010

Сообщений: 637

15.10.2010, 12:18

 [ТС]

19

Цитата
Сообщение от Alligieri
Посмотреть сообщение

не обьявлен в зоне видимости данного кода, определите как приватное поле

это как?
у меня nnc был только в:

C#
1
2
CookieContainer nnc = new CookieContainer();
request.CookieContainer = nnc;



0



Alligieri

CEO

Эксперт С++

2258 / 1248 / 57

Регистрация: 16.03.2009

Сообщений: 3,588

15.10.2010, 12:57

20

koc94ok, так он есть локальной переменной и извне не видим.

надо:

C#
1
private CookieContainer nnc;

обьявить



1



#7 - Переход между окнами в приложении

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

Видеоурок

Для перехода между страницами необходимо выполнять две задачи:

  1. скрывать окно в котором сейчас находитесь;
  2. открывать новое окно приложения.

Ниже приведен код для реализации подобного функицонала:

this.Hide(); // Скрываем нынешнее окно

// Создаем объект на основе определенного окан
MainForm mainForm = new MainForm();
// Показываем новое окно
mainForm.Show();

Программа обучения

Если вас интересует более углубленное изучение самого языка и его фреймворков, то предлагаем вашему внимаю наш полный курс по изучению C#. За курс вы изучите язык C#, научитесь делать веб проекты на основе ASP NET и строить приложения при помощи WinForms и WPF.

Материалы для курса

Чтобы скачивать материалы к видеокурсам необходимо оформить подписку на сайт

Большое задание по курсу

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

Также стоит посмотреть

Уроки Unity C# для начинающих

11 уроков

Изучение C# WPF на практике. Создание программ на C#

10 уроков

Изучение языка C# для начинающих

26 уроков

Изучение ASP.NET Core MVC. Создание сайтов на C#

10 уроков

Xamarin Forms / Мобильные приложения на C#

3 урока

Изучение C# и создание Windows программ

  • Remove From My Forums

 none

Переходы между формами

  • Вопрос

  • Всем привет. Возникла такая проблема.

    Есть две формы, необходимо сделать так, чтобы по клику на кнопку на первой форме — появлялась вторая, а первая скрывалась. А по клику на кнопку на второй форме — вторая закрывалась, а первая появлялась.

    Пробовал делать несколькими вариантами:

    Первый вариант:

    //кнопка на первой форме 
    private void button1_Click(object sender, EventArgs e)
            {
                Form f3 = new Form3();
               
                 f3.Show();
               button1.Enabled = false;
               this.Visible = false;
                
                
            }
    //евент, когда форма становится активной, чтоб визибл был тру
      private void Form2_Activated(object sender, EventArgs e)
            {
                this.Visible = true;
            }
    
    //кнопка на второй форме
     private void button2_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.Activate();
                this.Close();
            }

    Данный вариант не работает — первая форма не выходит из состояния невидимости.

    Вот второй вариант:

    // кнопка на первой форме 
    Form f3 = new Form3();
               
                 f3.Show();
               button1.Enabled = false;
               this.Hide();
    //кнопка на второй форме
      private void button2_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.Show();
                this.Close();
            }

    Этот вариант работает, но неверно. Почему-то на команду 

     f2.Show();

    Создаётся новый экземпляр Form2. А Form2 — главная форма приложения и в данном случае закрывая заново созданную форму 2  — приложение не закрывается, т.е. изначально созданная Form2 висит в невидимости.

    Извиняюсь за несколько путанное объяснение=) Помогите пожалуйста исправить ошибку.

Ответы

  • Вот рабочий вариант.

    //Form1.cs
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        private Form2 form2;
        public Form1()
        {
          InitializeComponent();
          form2 = new Form2(this) { Visible = false };
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          this.Visible = false;
          form2.Visible = true;
        }
      }
    }

    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
      public partial class Form2 : Form
      {
        private Form1 _form1;
        public Form2(Form1 form1)
        {
          _form1 = form1;
          InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          this.Visible = false;
          _form1.Visible = true;
        }
      }
    }

    Т.е. в проекте создаёте две формы, причём первая будет главной, а вторая второстепенной. При инициализации первой формы(т.е при запуске приложения) создаёте экземпляр второй формы, скрываете её и добавляете туда ссылку на текущую(т.е) первую форму. А потом
    при клике скрываете первую показываете вторую, показываете первую скрываете вторую в другом обработчике(второй формы).

    • Помечено в качестве ответа

      10 марта 2012 г. 5:28

The following solution works as you expect.

To try this sample code, create a new WinForms application in Visual Studio (i.e. File —> New Project, select Visual C# —> Windows Classic Desktop and use the template «Windows Forms App (.NET Framework)»), then add a 2nd form.

Ensure the two forms are named as Form1 and Form2, then modify the code in the generated solution as follows:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        (new Form2()).Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }
}

And this is the entry point of the application, modify it as follows:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Show first form and start the message loop
        (new Form1()).Show();
        Application.Run(); // needed, otherwise app closes immediately
    }

}

The trick is to use Application.Run() without parameters and Application.Exit() at the point where you want to exit the application.

Now when you run the application, Form1 opens up. Click on the X (upper right corner) and Form1 closes, but Form2 appears instead. Click on the X again and the form closes (and exits the application too).

Instead of placing the launch of Form2 into the FormClosed event, you could also create a button Button1 which does the job, but in that case don’t forget to close the form to which the button belongs to via this.Close() explicitly:

    private void button1_Click(object sender, EventArgs e)
    {
        (new Form2()).Show(); this.Close();
    }

The following solution works as you expect.

To try this sample code, create a new WinForms application in Visual Studio (i.e. File —> New Project, select Visual C# —> Windows Classic Desktop and use the template «Windows Forms App (.NET Framework)»), then add a 2nd form.

Ensure the two forms are named as Form1 and Form2, then modify the code in the generated solution as follows:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        (new Form2()).Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }
}

And this is the entry point of the application, modify it as follows:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Show first form and start the message loop
        (new Form1()).Show();
        Application.Run(); // needed, otherwise app closes immediately
    }

}

The trick is to use Application.Run() without parameters and Application.Exit() at the point where you want to exit the application.

Now when you run the application, Form1 opens up. Click on the X (upper right corner) and Form1 closes, but Form2 appears instead. Click on the X again and the form closes (and exits the application too).

Instead of placing the launch of Form2 into the FormClosed event, you could also create a button Button1 which does the job, but in that case don’t forget to close the form to which the button belongs to via this.Close() explicitly:

    private void button1_Click(object sender, EventArgs e)
    {
        (new Form2()).Show(); this.Close();
    }

I have some code here:

private void button1_Click(object sender, EventArgs e)
{
    Application.Run(new Form3());
}

Although I don’t think this is how you are meant to change forms, when I ran it, it threw an error stating:

Starting a second message loop on a
single thread is not a valid operation

H H's user avatar

H H

258k30 gold badges324 silver badges508 bronze badges

asked Jun 15, 2011 at 21:14

Dennis's user avatar

2

You cannot use Application.Run — that is for starting windows form application (internal message loop which is shared among all forms in the application), not for showing a form. Each form has Show and Hide method so you should simply call:

private void button1_Click(object sender, EventArgs e)
{
    Form3 f = new Form3(); // This is bad
    f.Show();
}

But you should not create form each time you want to show it. If you want to have only one instance of the form you should keep it as global and only show or hide it on demand. Otherwise you will have to call Close instead of Hide to clear all resources the form consumes.

answered Jun 15, 2011 at 21:20

Ladislav Mrnka's user avatar

Ladislav MrnkaLadislav Mrnka

359k59 gold badges657 silver badges666 bronze badges

you can do as simple as it is :

test mp = new test();
mp.Text = " Welcome Mr." + textBox1.Text;
this.Hide();
mp.ShowDialog();
this.Close();

where test is your new form
and then if you wona pass variables to the other form just make you variable as public then you can make :

 mp.Text = " Welcome Mr." + textBox1.Text;

then showdialog to show your new form and close the old form..

natiiix's user avatar

natiiix

9251 gold badge14 silver badges21 bronze badges

answered Jun 15, 2011 at 21:21

Tamer's user avatar

TamerTamer

841 silver badge8 bronze badges

Your first form should create the second form on the first usage and hide itself from view. Then the second form will hide itself and show the first form when you switch back. Something like this…

  private Form _firstForm;
  private Form _secondForm;

  private void switchToSecond_Click(object sender, EventArgs e)
  {    
      if (_secondForm == null)
          _secondForm = new SecondForm();

      Hide();
      _secondForm.Show();
  }

  private void switchToFirst_Click(object sender, EventArgs e)
  {    
      Hide();
      _firstForm.Show();
  }

You would assign to firstForm the this value inside the constructor of the first form class and because this is the main form it will always be created at application startup. If you want to save resources you could also dispose of the second form when you switch back to the first and so recreate it each time you switch.

answered Jun 16, 2011 at 5:19

Phil Wright's user avatar

Phil WrightPhil Wright

22.4k14 gold badges82 silver badges135 bronze badges

this.Hide(); // Hide the current form.

Menu menu = new Menu(); // Create new instance of the new form.

menu.Show(); // Show it

Andrew's user avatar

Andrew

2,21215 silver badges14 bronze badges

answered Jan 9, 2018 at 0:52

Stephan Kazcoskvski's user avatar

Assume you have Form1 and Form2
Your scope is not clear if you want

  1. Switch between Form1 and Form2 and keep both of them alive.

  2. Keep only either Form1 or Form2 at a time.

for case 1 simple Form1.Hide() and Form2.Show() would be adequate.

for case 2 the solution will be a little bit complicated.

  1. Create your own instance of ApplicationContext MyAppCxt= new ApplicationContext().
  2. instead of the default Program.Run(Form1) call Program.Run(MyAppCxt(Form1))
  3. in the handler of some event, when you need to switch the Form1 and Form2

    Form2 f2 = new Form2();//Create the new form
    MyAppCxt.MainForm = f2;//set Form2 as MainForm in the message queue
    Form2.Close()//Close Form2 and release all the resource
    F2.Show();//display Form2 to the user

the same scenario would be repeated when required to switch back between Form2 and Form1

answered Apr 4, 2019 at 10:34

Ahmed Bahtity's user avatar

I have some code here:

private void button1_Click(object sender, EventArgs e)
{
    Application.Run(new Form3());
}

Although I don’t think this is how you are meant to change forms, when I ran it, it threw an error stating:

Starting a second message loop on a
single thread is not a valid operation

H H's user avatar

H H

258k30 gold badges324 silver badges508 bronze badges

asked Jun 15, 2011 at 21:14

Dennis's user avatar

2

You cannot use Application.Run — that is for starting windows form application (internal message loop which is shared among all forms in the application), not for showing a form. Each form has Show and Hide method so you should simply call:

private void button1_Click(object sender, EventArgs e)
{
    Form3 f = new Form3(); // This is bad
    f.Show();
}

But you should not create form each time you want to show it. If you want to have only one instance of the form you should keep it as global and only show or hide it on demand. Otherwise you will have to call Close instead of Hide to clear all resources the form consumes.

answered Jun 15, 2011 at 21:20

Ladislav Mrnka's user avatar

Ladislav MrnkaLadislav Mrnka

359k59 gold badges657 silver badges666 bronze badges

you can do as simple as it is :

test mp = new test();
mp.Text = " Welcome Mr." + textBox1.Text;
this.Hide();
mp.ShowDialog();
this.Close();

where test is your new form
and then if you wona pass variables to the other form just make you variable as public then you can make :

 mp.Text = " Welcome Mr." + textBox1.Text;

then showdialog to show your new form and close the old form..

natiiix's user avatar

natiiix

9251 gold badge14 silver badges21 bronze badges

answered Jun 15, 2011 at 21:21

Tamer's user avatar

TamerTamer

841 silver badge8 bronze badges

Your first form should create the second form on the first usage and hide itself from view. Then the second form will hide itself and show the first form when you switch back. Something like this…

  private Form _firstForm;
  private Form _secondForm;

  private void switchToSecond_Click(object sender, EventArgs e)
  {    
      if (_secondForm == null)
          _secondForm = new SecondForm();

      Hide();
      _secondForm.Show();
  }

  private void switchToFirst_Click(object sender, EventArgs e)
  {    
      Hide();
      _firstForm.Show();
  }

You would assign to firstForm the this value inside the constructor of the first form class and because this is the main form it will always be created at application startup. If you want to save resources you could also dispose of the second form when you switch back to the first and so recreate it each time you switch.

answered Jun 16, 2011 at 5:19

Phil Wright's user avatar

Phil WrightPhil Wright

22.4k14 gold badges82 silver badges135 bronze badges

this.Hide(); // Hide the current form.

Menu menu = new Menu(); // Create new instance of the new form.

menu.Show(); // Show it

Andrew's user avatar

Andrew

2,21215 silver badges14 bronze badges

answered Jan 9, 2018 at 0:52

Stephan Kazcoskvski's user avatar

Assume you have Form1 and Form2
Your scope is not clear if you want

  1. Switch between Form1 and Form2 and keep both of them alive.

  2. Keep only either Form1 or Form2 at a time.

for case 1 simple Form1.Hide() and Form2.Show() would be adequate.

for case 2 the solution will be a little bit complicated.

  1. Create your own instance of ApplicationContext MyAppCxt= new ApplicationContext().
  2. instead of the default Program.Run(Form1) call Program.Run(MyAppCxt(Form1))
  3. in the handler of some event, when you need to switch the Form1 and Form2

    Form2 f2 = new Form2();//Create the new form
    MyAppCxt.MainForm = f2;//set Form2 as MainForm in the message queue
    Form2.Close()//Close Form2 and release all the resource
    F2.Show();//display Form2 to the user

the same scenario would be repeated when required to switch back between Form2 and Form1

answered Apr 4, 2019 at 10:34

Ahmed Bahtity's user avatar

В проекте WinForms есть два вида форм — главная и дочерние. Разница между ними в том, что главная форма по сути и является приложением, поэтому при ее закрытии происходит выход из приложения.

Одним из решений является скрытие главной формы, вместо закрытия. Этот вариант уже написан в вопросе. Он обычно применяется, когда главная форма так или иначе используется в дальнейшем.

Если первая форма в дальнейшем не используется, то можно использовать 2 варианта:

1. Правим Program.cs

По умолчанию содержимое файла Program.cs выглядит так:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Как вы можете заметить, Form1 запускается как приложение и, при завершении работы формы, произойдет выход из Main и приложения.

Чтобы этого не произошло, можно прописать последовательность запуска форм:

Application.Run(new Form1());
Application.Run(new Form2());
Application.Run(new Form3());

Тогда при закрытии первой формы, будет вызвана вторая и так до последней.

Недостаток — сложно передавать данные между формами. Да можно определить поля в классе Program, конструкторы с параметрами в формах и передавать данные через эти поля и параметры конструкторов, но что делать если нужно вернуться в одну из предыдущих форм? Пилить сложную логику переходов в Main — не сама лучшая идея, мягко говоря.

2. Переходим от форм к контролам

В WinForms есть замечательный класс UserControl. Это фактически пустой контрол, который вы можете наполнить любым содержимым как и форму.

После того, как набор таких контролов подготовлен, вам остается только разместить их на форме с параметром Dock = DockStyle.Fill и управляя значением свойства Conrol.Visible, показывать тот контрол, который вам нужен в данный момент. Если не хотите держать контрол в памяти, ни кто не мешает просто создавать его в нужный момент и отображать, а после использования и переключения на новый контрол, отписаться от событий, вызвать Dispose(), удалить все ссылки и отдать его на растерзание сборщику мусора. Только выигрыш от этого невелик, особенно если вдруг надумаете снова его показать.


Забыл написать про еще один недостаток переключения между формами через Main. Каждая новая форма будет открываться немного в другом месте, может для защиты от программ-автокликеров это и хорошо, но меня, как пользователя, такое поведение раздражает, и думаю что не только меня.


Ещё можно не передавать форму в Application.Run и запустить его без параметров. Тогда даже закрытие всех форм не приведёт к закрытию приложения. Чтобы выйти окончательно необходимо будет вызвать Application.Exit – Lunar Whisper

Тоже хороший вариант, если необходимо использовать разные формы в процессе работы.

Понравилась статья? Поделить с друзьями:
  • Переход между дисками в командной строке windows
  • Переход между директориями в командной строке windows
  • Переход к заводским настройкам windows 10
  • Переход в тестовый режим windows 10
  • Переход в спящий режим при закрытии крышки ноутбука windows 11