Лучший отвечающий
Переходы между формами

Вопрос
-
Всем привет. Возникла такая проблема.
Есть две формы, необходимо сделать так, чтобы по клику на кнопку на первой форме - появлялась вторая, а первая скрывалась. А по клику на кнопку на второй форме - вторая закрывалась, а первая появлялась.
Пробовал делать несколькими вариантами:
Первый вариант:
//кнопка на первой форме 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