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

  • Вопрос

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

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

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

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

    //кнопка на первой форме 
    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 висит в невидимости.

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

    9 марта 2012 г. 11:14

Ответы

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

    //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;
        }
      }
    }

    Т.е. в проекте создаёте две формы, причём первая будет главной, а вторая второстепенной. При инициализации первой формы(т.е при запуске приложения) создаёте экземпляр второй формы, скрываете её и добавляете туда ссылку на текущую(т.е) первую форму. А потом при клике скрываете первую показываете вторую, показываете первую скрываете вторую в другом обработчике(второй формы).
    • Помечено в качестве ответа Nik_A 10 марта 2012 г. 5:28
    9 марта 2012 г. 14:14
    Модератор

Все ответы

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

    //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;
        }
      }
    }

    Т.е. в проекте создаёте две формы, причём первая будет главной, а вторая второстепенной. При инициализации первой формы(т.е при запуске приложения) создаёте экземпляр второй формы, скрываете её и добавляете туда ссылку на текущую(т.е) первую форму. А потом при клике скрываете первую показываете вторую, показываете первую скрываете вторую в другом обработчике(второй формы).
    • Помечено в качестве ответа Nik_A 10 марта 2012 г. 5:28
    9 марта 2012 г. 14:14
    Модератор
  • спасибо
    10 марта 2012 г. 5:29
  • Также можно обойтись без передачи ссылки на первую форму во вторую. Можно подписаться на событие VisibleChanges и там проверять видна ли форма или нет:

        public partial class Form1 : Form
        {
            Form2 f2;
    
            public Form1()
            {
                InitializeComponent();
    
                f2 = new Form2();
                f2.VisibleChanged += new EventHandler(f2_VisibleChanged);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {            
                f2.Show();
            }
    
            void f2_VisibleChanged(object sender, EventArgs e)
            {            
                this.Visible = !f2.Visible;   
            }
        }

    А во второй форме по клику просто скрывать саму форму.

    Для связи [mail]

    12 марта 2012 г. 8:27
  • Люди HELLP!

    У меня такая же проблема.

    Пишу в Visual Studio 2012 проект на Windows Form (C#) и при вставке в проект выше написанное решение выпадает куда ошибок. При условии что создал 1 проект нулевой в нём вторую форму для проверки. В каждой по кнопке. И всё выпадают в ошибки обе формы. Там ошибка типо того что нельзя что то там редактировать.

    Может подскажите что не так делаю? Может не туда вставляю выше указанный код?

    Заранее спасибо всем!

    7 октября 2014 г. 6:19