Переход от одной формы к другой windows form

Переход с одной формы на другую C# Решение и ответ на вопрос 537069

Виктория13

1

Переход с одной формы на другую

02.04.2012, 20:19. Показов 37390. Ответов 3


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

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

169 / 169 / 56

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

Сообщений: 251

02.04.2012, 20:40

2



0



LapisAlchemist

251 / 163 / 14

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

Сообщений: 544

02.04.2012, 20:46

3

В событии Click объекта, по которому нужно щелкнуть мышью, нужно написать следующий код:

C#
1
2
Form2 newfrm = new Form2();//Form2 -- вторая форма
newfrm.Show();

А если вторая форма инициализируется в одном месте кода первой формы, а перейти на нее нужно в другом, то нужно создать глобальную переменную типа Form2, чтобы она была доступна во всем коде первой формы (объявлять перед конструктором public Form1()…), а затем активизировать эту вторую форму кодом <имя_переменной>.Activate();.



4



bilolbek

0 / 0 / 1

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

Сообщений: 57

26.04.2015, 07:35

4

просто пишите в кнопке в форме 1 данный код

C#
1
2
3
4
5
6
7
       
 private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            Form2 f2 = new Form2();
            f2.ShowDialog();
        }



0



I’m using winforms now.
I have the main form «form1» and I have a button that opens form2.
When I open form2 I would like for form1 to disappear. When the user click the x button on form2 I would like for it to close and go back to form1. I wouldn’t like to use modal windows.

Corey Adler's user avatar

Corey Adler

15.8k18 gold badges66 silver badges80 bronze badges

asked May 1, 2011 at 11:47

Itay.B's user avatar

    private void button1_Click(object sender, EventArgs e) {
        var frm = new Form2();
        frm.Location = this.Location;
        frm.StartPosition = FormStartPosition.Manual;
        frm.FormClosing += delegate { this.Show(); };
        frm.Show();
        this.Hide();
    }

answered May 1, 2011 at 11:56

Hans Passant's user avatar

Hans PassantHans Passant

913k145 gold badges1671 silver badges2507 bronze badges

1

In order not to change Form’s Properties, simply use the ShowDialog() method in Form1.cs code to open Form2. That will deactivate Form1:

void OpenSecondForm()
{
  Form form2 = new Form();
  form2.ShowDialog();
}

KernelPanic's user avatar

KernelPanic

2,4767 gold badges45 silver badges87 bronze badges

answered Nov 18, 2016 at 12:09

YuriArtem's user avatar

1

Добавление форм. Взаимодействие между формами

Последнее обновление: 31.10.2015

Чтобы добавить еще одну форму в проект, нажмем на имя проекта в окне Solution Explorer (Обозреватель решений) правой кнопкой мыши и выберем
Add(Добавить)->Windows Form…

добавление новой формы

Дадим новой форме какое-нибудь имя, например, Form2.cs:

создание новой формы

Итак, у нас в проект была добавлена вторая форма. Теперь попробуем осуществить взаимодействие между двумя формами. Допустим, первая форма
по нажатию на кнопку будет вызывать вторую форму. Во-первых, добавим на первую форму Form1 кнопку и двойным щелчком по кнопке перейдем в файл кода. Итак,
мы попадем в обработчик события нажатия кнопки, который создается по умолчанию после двойного щелчка по кнопке:

private void button1_Click(object sender, EventArgs e)
{

}

Теперь добавим в него код вызова второй формы. У нас вторая форма называется Form2, поэтому сначала мы создаем объект данного класса, а потом для его
отображения на экране вызываем метод Show:

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

Теперь сделаем наоборот — чтобы вторая форма воздействовала на первую. Пока вторая форма не знает о существовании первой. Чтобы это исправить, надо
второй форме как-то передать сведения о первой форме. Для этого воспользуемся передачей ссылки на форму в конструкторе.

Итак перейдем ко второй форме и перейдем к ее коду — нажмем правой кнопкой мыши на форму и выберем View Code (Просмотр кода). Пока он пустой и
содержит только конструктор. Поскольку C# поддерживает перегрузку методов, то мы можем создать несколько методов и конструкторов с разными
параметрами и в зависимости от ситуации вызывать один из них. Итак, изменим файл кода второй формы на следующий:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HelloApp
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public Form2(Form1 f)
        {
            InitializeComponent();
            f.BackColor = Color.Yellow;
        }
    }
}

Фактически мы только добавили здесь новый конструктор public Form2(Form1 f), в котором мы получаем первую форму и устанавливаем ее фон
в желтый цвет. Теперь перейдем к коду первой формы, где мы вызывали вторую форму и изменим его на следующий:

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

Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект — объект Form1, то при создании второй формы она будет получать ее (ссылку)
и через нее управлять первой формой.

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

Мы можем также создавать объекты и текущей формы:

private void button1_Click(object sender, EventArgs e)
{
	Form1 newForm1 = new Form1();
	newForm1.Show();
		
	Form2 newForm2 = new Form2(newForm1);
	newForm2.Show();
}

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

  • 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

I have form which is opened using ShowDialog Method. In this form i have a Button called More.
If we click on More it should open another form and it should close the current form.

on More Button’s Click event Handler i have written the following code

MoreActions objUI = new MoreActions (); 
objUI.ShowDialog();
this.Close();

But what is happening is, it’s not closing the first form. So, i modified this code to

MoreActions objUI = new MoreActions (); 
objUI.Show();
this.Close();

Here, The second form is getting displayed and within seconds both the forms getting closed.

Can anybody please help me to fix issue. What i need to do is, If we click on More Button, it should open another form and close the first form.

Any kind of help will be really helpful to me.

asked Oct 19, 2010 at 3:03

Dinesh's user avatar

1

In my opinion the main form should be responsible for opening both child form. Here is some pseudo that explains what I would do:

// MainForm
private ChildForm childForm;
private MoreForm moreForm;

ButtonThatOpenTheFirstChildForm_Click()
{
    childForm = CreateTheChildForm();
    childForm.MoreClick += More_Click;
    childForm.Show();
}

More_Click()
{
    childForm.Close();
    moreForm = new MoreForm();
    moreForm.Show();
}

You will just need to create a simple event MoreClick in the first child. The main benefit of this approach is that you can replicate it as needed and you can very easily model some sort of basic workflow.

answered Oct 19, 2010 at 5:38

Johann Blais's user avatar

Johann BlaisJohann Blais

9,3296 gold badges45 silver badges64 bronze badges

3

If I got you right, are you trying like this?

alt text

into this?
alt text

in your Form1, add this event in your button:

    // button event in your Form1
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog(); // Shows Form2
    }

then, in your Form2 add also this event in your button:

    // button event in your Form2
    private void button1_Click(object sender, EventArgs e)
    {
        Form3 f3 = new Form3(); // Instantiate a Form3 object.
        f3.Show(); // Show Form3 and
        this.Close(); // closes the Form2 instance.
    }

answered Oct 19, 2010 at 3:59

yonan2236's user avatar

yonan2236yonan2236

13.2k32 gold badges94 silver badges139 bronze badges

2

ok so I used this:

public partial class Form1 : Form
{
    private void Button_Click(object sender, EventArgs e)
    {
        Form2 myForm = new Form2();
        this.Hide();
        myForm.ShowDialog();
        this.Close();
    }
}

This seems to be working fine but the first form is just hidden and it can still generate events. the «this.Close()» is needed to close the first form but if you still want your form to run (and not act like a launcher) you MUST replace it with

this.Show();

Best of luck!

Funlamb's user avatar

Funlamb

5495 silver badges18 bronze badges

answered Jul 15, 2013 at 20:17

user2584967's user avatar

1

I would use a value that gets set when more button get pushed closed the first dialog and then have the original form test the value and then display the the there dialog.

For the Ex

  1. Create three windows froms
  2. Form1 Form2 Form3
  3. Add One button to Form1
  4. Add Two buttons to form2

Form 1 Code

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private bool DrawText = false;

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog();
        if (f2.ShowMoreActions)
        {
            Form3 f3 = new Form3();
            f3.ShowDialog();
        }

    }

Form2 code

 public partial class Form2 : Form
 {
        public Form2()
        {
            InitializeComponent();
        }

        public bool ShowMoreActions = false;
        private void button1_Click(object sender, EventArgs e)
        {
            ShowMoreActions = true;
            this.Close();
        }


        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

Leave form3 as is

answered Oct 19, 2010 at 3:19

rerun's user avatar

rerunrerun

24.7k6 gold badges48 silver badges77 bronze badges

Try this..

//button1 will be clicked to open a new form
private void button1_Click(object sender, EventArgs e)
{
    this.Visible = false;     // this = is the current form
    SignUp s = new SignUp();  //SignUp is the name of  my other form
    s.Visible = true;
}

Arun Singh's user avatar

Arun Singh

1,5284 gold badges19 silver badges43 bronze badges

answered Oct 1, 2012 at 5:26

fmp's user avatar

1

private void Button1_Click(object sender, EventArgs e)
{
    NewForm newForm = new NewForm();    //Create the New Form Object
    this.Hide();    //Hide the Old Form
    newForm.ShowDialog();    //Show the New Form
    this.Close();    //Close the Old Form
}

answered Oct 4, 2019 at 17:29

Robert Karamagi's user avatar

1

you may consider this example

//Form1 Window
//EventHandler
Form1 frm2 = new Form1();
{
    frm2.Show(this); //this will show Form2
    frm1.Hide();  //this Form will hide
}

answered Aug 14, 2017 at 1:22

Ramgy Borja's user avatar

Ramgy BorjaRamgy Borja

2,2142 gold badges18 silver badges39 bronze badges

For example, you have a Button named as Button1. First click on it it will open the EventHandler of that Button2 to call another Form you should write the following code to your Button.

your name example=form2.

form2 obj=new form2();

obj.show();

To close form1, write the following code:

form1.visible=false;
or
form1.Hide();

Vimal CK's user avatar

Vimal CK

3,5131 gold badge25 silver badges47 bronze badges

answered Apr 5, 2017 at 5:16

Mahmud Yusuf Sani MahmudCodes's user avatar

You could try adding a bool so the algorithm would know when the button was activated. When it’s clicked, the bool checks true, the new form shows and the last gets closed.

It’s important to know that forms consume some ram (at least a little bit), so it’s a good idea to close those you’re not gonna use, instead of just hiding it. Makes the difference in big projects.

answered May 28, 2018 at 4:28

Rafael's user avatar

You need to control the opening of sub forms from a main form.

In my case I’m opening a Login window first before I launch my form1. I control everything from Program.cs. Set up a validation flag in Program.cs. Open Login window from Program.cs. Control then goes to login window. Then if the validation is good, set the validation flag to true from the login window. Now you can safely close the login window. Control returns to Program.cs. If the validation flag is true, open form1. If the validation flag is false, your application will close.

In Program.cs:

   static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        /// 

        //Validation flag
        public static bool ValidLogin = false;

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


            Application.Run(new Login());

            if (ValidLogin)
            {
                Application.Run(new Form1());
            }
        }

    }

In Login.cs:

       private void btnOK_Click(object sender, EventArgs e)
        {
            if (txtUsername.Text == "x" && txtPassword.Text == "x")
            {
                Program.ValidLogin = true;
                this.Close();
            }
            else
            {
                MessageBox.Show("Username or Password are incorrect.");
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

answered Oct 25, 2019 at 23:31

Dominic Isaia's user avatar

Use this.Hide() instead of this.Close()

answered Aug 12, 2020 at 20:31

izzetot's user avatar

Do this to Program.cs

using System;

namespace ProjectName 
{
    public class Program
    {
        [STAThread]
        public static void Main(string[] args) 
        {
            Application.EnableVisualStyles();
            Application.SetDefaultCompatibleTextRendering(false);

            new Form1().Show();

            Application.Run();
        }
    }
}

answered Apr 3, 2022 at 19:11

Madhav Balakrishnan Nair's user avatar

I have form which is opened using ShowDialog Method. In this form i have a Button called More.
If we click on More it should open another form and it should close the current form.

on More Button’s Click event Handler i have written the following code

MoreActions objUI = new MoreActions (); 
objUI.ShowDialog();
this.Close();

But what is happening is, it’s not closing the first form. So, i modified this code to

MoreActions objUI = new MoreActions (); 
objUI.Show();
this.Close();

Here, The second form is getting displayed and within seconds both the forms getting closed.

Can anybody please help me to fix issue. What i need to do is, If we click on More Button, it should open another form and close the first form.

Any kind of help will be really helpful to me.

asked Oct 19, 2010 at 3:03

Dinesh's user avatar

1

In my opinion the main form should be responsible for opening both child form. Here is some pseudo that explains what I would do:

// MainForm
private ChildForm childForm;
private MoreForm moreForm;

ButtonThatOpenTheFirstChildForm_Click()
{
    childForm = CreateTheChildForm();
    childForm.MoreClick += More_Click;
    childForm.Show();
}

More_Click()
{
    childForm.Close();
    moreForm = new MoreForm();
    moreForm.Show();
}

You will just need to create a simple event MoreClick in the first child. The main benefit of this approach is that you can replicate it as needed and you can very easily model some sort of basic workflow.

answered Oct 19, 2010 at 5:38

Johann Blais's user avatar

Johann BlaisJohann Blais

9,3296 gold badges45 silver badges64 bronze badges

3

If I got you right, are you trying like this?

alt text

into this?
alt text

in your Form1, add this event in your button:

    // button event in your Form1
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog(); // Shows Form2
    }

then, in your Form2 add also this event in your button:

    // button event in your Form2
    private void button1_Click(object sender, EventArgs e)
    {
        Form3 f3 = new Form3(); // Instantiate a Form3 object.
        f3.Show(); // Show Form3 and
        this.Close(); // closes the Form2 instance.
    }

answered Oct 19, 2010 at 3:59

yonan2236's user avatar

yonan2236yonan2236

13.2k32 gold badges94 silver badges139 bronze badges

2

ok so I used this:

public partial class Form1 : Form
{
    private void Button_Click(object sender, EventArgs e)
    {
        Form2 myForm = new Form2();
        this.Hide();
        myForm.ShowDialog();
        this.Close();
    }
}

This seems to be working fine but the first form is just hidden and it can still generate events. the «this.Close()» is needed to close the first form but if you still want your form to run (and not act like a launcher) you MUST replace it with

this.Show();

Best of luck!

Funlamb's user avatar

Funlamb

5495 silver badges18 bronze badges

answered Jul 15, 2013 at 20:17

user2584967's user avatar

1

I would use a value that gets set when more button get pushed closed the first dialog and then have the original form test the value and then display the the there dialog.

For the Ex

  1. Create three windows froms
  2. Form1 Form2 Form3
  3. Add One button to Form1
  4. Add Two buttons to form2

Form 1 Code

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private bool DrawText = false;

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog();
        if (f2.ShowMoreActions)
        {
            Form3 f3 = new Form3();
            f3.ShowDialog();
        }

    }

Form2 code

 public partial class Form2 : Form
 {
        public Form2()
        {
            InitializeComponent();
        }

        public bool ShowMoreActions = false;
        private void button1_Click(object sender, EventArgs e)
        {
            ShowMoreActions = true;
            this.Close();
        }


        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

Leave form3 as is

answered Oct 19, 2010 at 3:19

rerun's user avatar

rerunrerun

24.7k6 gold badges48 silver badges77 bronze badges

Try this..

//button1 will be clicked to open a new form
private void button1_Click(object sender, EventArgs e)
{
    this.Visible = false;     // this = is the current form
    SignUp s = new SignUp();  //SignUp is the name of  my other form
    s.Visible = true;
}

Arun Singh's user avatar

Arun Singh

1,5284 gold badges19 silver badges43 bronze badges

answered Oct 1, 2012 at 5:26

fmp's user avatar

1

private void Button1_Click(object sender, EventArgs e)
{
    NewForm newForm = new NewForm();    //Create the New Form Object
    this.Hide();    //Hide the Old Form
    newForm.ShowDialog();    //Show the New Form
    this.Close();    //Close the Old Form
}

answered Oct 4, 2019 at 17:29

Robert Karamagi's user avatar

1

you may consider this example

//Form1 Window
//EventHandler
Form1 frm2 = new Form1();
{
    frm2.Show(this); //this will show Form2
    frm1.Hide();  //this Form will hide
}

answered Aug 14, 2017 at 1:22

Ramgy Borja's user avatar

Ramgy BorjaRamgy Borja

2,2142 gold badges18 silver badges39 bronze badges

For example, you have a Button named as Button1. First click on it it will open the EventHandler of that Button2 to call another Form you should write the following code to your Button.

your name example=form2.

form2 obj=new form2();

obj.show();

To close form1, write the following code:

form1.visible=false;
or
form1.Hide();

Vimal CK's user avatar

Vimal CK

3,5131 gold badge25 silver badges47 bronze badges

answered Apr 5, 2017 at 5:16

Mahmud Yusuf Sani MahmudCodes's user avatar

You could try adding a bool so the algorithm would know when the button was activated. When it’s clicked, the bool checks true, the new form shows and the last gets closed.

It’s important to know that forms consume some ram (at least a little bit), so it’s a good idea to close those you’re not gonna use, instead of just hiding it. Makes the difference in big projects.

answered May 28, 2018 at 4:28

Rafael's user avatar

You need to control the opening of sub forms from a main form.

In my case I’m opening a Login window first before I launch my form1. I control everything from Program.cs. Set up a validation flag in Program.cs. Open Login window from Program.cs. Control then goes to login window. Then if the validation is good, set the validation flag to true from the login window. Now you can safely close the login window. Control returns to Program.cs. If the validation flag is true, open form1. If the validation flag is false, your application will close.

In Program.cs:

   static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        /// 

        //Validation flag
        public static bool ValidLogin = false;

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


            Application.Run(new Login());

            if (ValidLogin)
            {
                Application.Run(new Form1());
            }
        }

    }

In Login.cs:

       private void btnOK_Click(object sender, EventArgs e)
        {
            if (txtUsername.Text == "x" && txtPassword.Text == "x")
            {
                Program.ValidLogin = true;
                this.Close();
            }
            else
            {
                MessageBox.Show("Username or Password are incorrect.");
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

answered Oct 25, 2019 at 23:31

Dominic Isaia's user avatar

Use this.Hide() instead of this.Close()

answered Aug 12, 2020 at 20:31

izzetot's user avatar

Do this to Program.cs

using System;

namespace ProjectName 
{
    public class Program
    {
        [STAThread]
        public static void Main(string[] args) 
        {
            Application.EnableVisualStyles();
            Application.SetDefaultCompatibleTextRendering(false);

            new Form1().Show();

            Application.Run();
        }
    }
}

answered Apr 3, 2022 at 19:11

Madhav Balakrishnan Nair's user avatar

C# изучаю не так давно и встала передо мной недавно задача:
— открыть Form2 при нажатии на кнопку в Form1;
— спрятать Form1;
— открыть Form1 при закрытии Form2.
На первый взгляд задача показалась элементарной, но… возникли нюансы — при закрытии приложения оно не выгружалось и в диспетчере задач мы наблюдали его работу, хотя визуально оно как бы закрылось.

В чём же причина такого поведения? Об этом расскажу дальше. Рассмотрим открытие и закрытие форм на примерах.

Открываем и закрываем форму из другой формы

У нас в приложении есть две формы Form1 — главная, которая открывается сразу при запуске приложения и Form2, которую открываем по нажатию на кнопку.

Чтобы открыть Form2 нам необходим следующий код, который будет срабатывать при нажатии на кнопку:

private void button1_Click(object sender, EventArgs e)
{
    Form ifrm = new Form2();
    ifrm.Show(); 
    this.Hide(); 
}

Теперь у нас открылась Form2 и спряталась Form1. Поработав с Form2 мы её закрываем и при этом нам надо после этого отобразить Form1. Многие начинающие, включая меня начинают писать следующий код, который помещаем в событие, которое происходит после закрытия Form2:

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
    Form ifrm = new Form1();
    ifrm.Show(); 
    this.Close(); 

}

Вроде всё логично: Form2 закрылась, Form1 открылась. Однако используя этот метод, мы можем заметить, что после того как мы закрываем приложение оно продолжает висеть в памяти. Многие, не зная почему это происходит дописывают в метод «Form1_FormClosed» дописывают принудительное закрытие приложения:

Application.Exit();

Это работает, однако правильно ли это? Решать вам.

А теперь ответим на вопрос «почему приложение висит в памяти» и рассмотрим простое и правильное решение.

Первая часть кода: мы отображаем Form2 и скрываем Form1. Не закрываем, а именно скрываем, т.е. экземпляр Form1 продолжает существовать.

Закрыть Form1 вместо скрытия не получится, так как это главная форма приложения и при её закрытии мы закроем всё приложение.

Вторая часть кода: строкой «Form ifrm = new Form1();» мы создаём второй экземпляр Form1 и далее его и отображаем, а первый экземпляр Form1 продолжает жить в памяти. И когда мы закрываем приложение (Form1), то первый экземпляр при этом не закрываем он так и «сидит» в памяти, поэтому приложение не выгружается из памяти. В связи с этим многие и закрывают принудительно приложение при закрытии главной формы (Form1).

Сейчас мы с вами рассмотрим правильный код, который не будет создавать второй экземпляр Form1 и отображать его, а будет отображать скрытую до этого Form1.

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{

    Form ifrm = Application.OpenForms[0];
    ifrm.Show();
}

OpenForms — получает коллекцию открытых форм приложения. В нашем случае мы сразу обратились к главной форме приложения (OpenForms[0]).

Теперь при закрытии Form2 у нас будет вызываться и отображаться та форма, которая породила закрывающуюся.

Учитываем координаты форм при открытии

Представьте ситуацию. Открыта Form1 вы её перемещаете в правый верхний угол экрана. Потом нажимаете на кнопку и… Form2 открывается по центру экрана или в другом месте, но не в том месте, где была Form1. Многие улыбнуться и скажут, что в свойствах Form2 надо прописать/указать следующее «StartPosition -> CenterParent» и открывать Form2 следующим методом:

Form ifrm = new Form2();
ifrm.ShowDialog();

Это правильное решение, которое всегда будет открывать Form2 поверх Form1 и всегда по центру Form1. Однако этот код не применим, если вам надо скрывать Form1, так как Form1 не будет скрываться.

Сейчас приведу полное решение, которое позволит открывать Form1 и Form2 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):

— свойство Form1: «StartPosition -> CenterScreen»
— свойство Form2: «StartPosition -> Manual»

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

Код в Form1:

private void button1_Click(object sender, EventArgs e)
{
    Form ifrm = new Form2();
    ifrm.Left = this.Left; 
    ifrm.Top = this.Top; 
    ifrm.Show(); 
    this.Hide(); 
}

Код в Form2:

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{

    Form ifrm = Application.OpenForms[0];
    ifrm.StartPosition = FormStartPosition.Manual; 
    ifrm.Left = this.Left; 
    ifrm.Top = this.Top; 
    ifrm.Show(); 
}

Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.

Открываем форму поверх другой формы, как модальное окно

Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:

private void button1_Click(object sender, EventArgs e)
{
    Form ifrm = new Form2();
    ifrm.ShowDialog();
}

В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.

На этом всё.

Иногда бывает нужно обратиться к элементам какой-то формы из другой в процессе выполнения программы. Например, есть форма Form1, из нее мы открываем другую Form2 и теперь, работая в форме Form2 нужно обратиться, получить доступ к элементам родительской формы Form1. Я нашел несколько способов как это сделать.

1-й способ. Передача ссылки в public переменную.

Перед открытием формы, передаем ссылку на нужный элемент в переменную public вызываемой формы.

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.but1 = this.button1; // передаем ссылку на кнопку в форму Form2
            frm.ShowDialog();
        }
    }
}

В форме Form2 переменная, в которую передавали ссылку, будет теперь соответствовать кнопке button1 из формы Form1

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        public Button but1; // эта переменная будет содержать ссылку на кнопку button1 из формы Form1

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            but1.Text = "test"; // меняем текст на кнопке button1 формы Form1
        }
    }
}

2-й способ. Передача ссылки в дочернюю форму.

Суть примерна та же, то и в 1-м способе. При открытии формы Form2 передаем в нее ссылку на элемент, который планируем потом менять.

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2(this.button1); // передаем ссылку на кнопку в форму Form2
            frm.ShowDialog();
        }
    }
}

Теперь в форме Form2 нужно создать переменную, которая будет содержать ссылку на эту кнопку и через нее будем обращаться к кнопке на Form1 (строки 5,7,9 и 15).

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        private Button but1; // эта переменная будет содержать ссылку на кнопку button1 из формы Form1

        public Form2(Button but) // получаем ссылку на кнопку в переменную but
        {
            but1 = but; // теперь but1 будет ссылкой на кнопку button1
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            but1.Text = "test"; // меняем текст на кнопке button1 формы Form1
        }
    }
}

3-й способ. Доступ ко всей родительской форме.

Чтобы осуществить это, нужно внести изменения в нескольких файлах, но зато при этом получим доступ ко всем элементам родительской формы и не нужно передавать ссылку на каждый элемент, как в 1-м способе.

Шаг 1. В файле Program.cs создаем публичную переменную f1 (строка 5).

namespace WindowsApplication1
{
    static class Program
    {
        public static Form1 f1; // переменная, которая будет содержать ссылку на форму Form1
        
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Шаг 2. Открываем Form1.Designer.cs и в нем у элементов, к которым нужно будет обратиться из другой формы, меняем private на public. Например, сделаем доступной для изменений кнопку button1 на форме Form1.

public System.Windows.Forms.Button button1; // заменили private на public

Шаг 3. При создании формы Form1 присваиваем переменной f1 ссылку на эту форму (строка 7)

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            Program.f1 = this; // теперь f1 будет ссылкой на форму Form1
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.ShowDialog();
        }
    }
}

Шаг 4. Теперь из абсолютно любой формы или из любого класса можно обратиться к элементу button1 находящемуся на Form1 так: Program.f1.button1. Например, пусть кнопка в Form2 поменяет текст кнопки на Form1:

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Program.f1.button1.Text = "test"; // Меняем текст на кнопке формы Form1
        }
    }
}

Понравилась статья? Поделить с друзьями:
  • Переход на про версию windows 10
  • Перечислите наиболее важные нововведения в windows 10 кратко
  • Переход на локальную учетную запись устройства windows 10
  • Перечислите методы сортировки объектов кратко в windows
  • Перечислите категории объектов предоставляемые операционной системой windows приложению