koc94ok 13 / 13 / 2 Регистрация: 22.04.2010 Сообщений: 637 |
||||
1 |
||||
Переход между формами14.10.2010, 18:32. Показов 122773. Ответов 30 Метки нет (Все метки)
Нажатием на клавишу закрыть текущую форму(Form1) и открыть новую(Form2)
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
14.10.2010, 18:32 |
Ответы с готовыми решениями: Переход между формами Правильный переход между формами Обычный переход между формами Переход между двумя формами 30 |
free6878 9 / 9 / 1 Регистрация: 01.09.2010 Сообщений: 182 |
||||
14.10.2010, 18:53 |
2 |
|||
Вот как-то так!?
2 |
koc94ok 13 / 13 / 2 Регистрация: 22.04.2010 Сообщений: 637 |
||||
14.10.2010, 19:43 [ТС] |
3 |
|||
Вот как-то так!? вторая форма появляется и тут же закрывается, нет не так к сожалению
0 |
CEO 2258 / 1248 / 57 Регистрация: 16.03.2009 Сообщений: 3,588 |
|
14.10.2010, 20:41 |
4 |
вторая форма появляется и тут же закрывается, нет не так к сожалению это потому что у вас первая форма является главной в приложении — при ее закрытии программа завершается. Чтоб скрыть можно вызвать метод Hide(), только потом не забудьте убить форму
1 |
13 / 13 / 2 Регистрация: 22.04.2010 Сообщений: 637 |
|
14.10.2010, 20:52 [ТС] |
5 |
это потому что у вас первая форма является главной в приложении — при ее закрытии программа завершается. Чтоб скрыть можно вызвать метод Hide(), только потом не забудьте убить форму А если в program.cs похимичить? Условие какое-либо добавить(или цикл пока) чтобы только при выполнении него первая форма закрылась и открылась вторая? зы как убить первую форму?
0 |
CEO 2258 / 1248 / 57 Регистрация: 16.03.2009 Сообщений: 3,588 |
|
14.10.2010, 21:00 |
6 |
А если в program.cs похимичить? Не стоит
Условие какое-либо добавить(или цикл пока) чтобы только при выполнении него первая форма закрыталась и открылась вторая? думаю плохо будет
зы как убить первую форму? передаем ссылку на нее во вторую форму и вызвываем form1.Close() при закрытии второй формы (или последней сторонней формы)
0 |
13 / 13 / 2 Регистрация: 22.04.2010 Сообщений: 637 |
|
14.10.2010, 21:05 [ТС] |
7 |
Не стоит думаю плохо будет передаем ссылку на нее во вторую форму и вызвываем 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 |
|||||||
делаю так:
и так
результат — ошибка…
0 |
Alligieri CEO 2258 / 1248 / 57 Регистрация: 16.03.2009 Сообщений: 3,588 |
||||
15.10.2010, 01:16 |
10 |
|||
koc94ok, ну у меня слов нет вы ж программистом хотите быть вроде?
Добавлено через 54 секунды
1 |
koc94ok 13 / 13 / 2 Регистрация: 22.04.2010 Сообщений: 637 |
||||
15.10.2010, 08:34 [ТС] |
11 |
|||
Нашел в инете еще такой способ:
Вроде тоже работает
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 |
|||||||
koc94ok, вы явно не читаете те ссылки что я вам даю в 7 ЧаВо по формам все прекрасно описано. Способов есть несколько, но я чаще всего передаю в конструктор и потом сохраняю в приватное поле читал и делал как там сказано
form1
ошибки почти везде
0 |
CEO 2258 / 1248 / 57 Регистрация: 16.03.2009 Сообщений: 3,588 |
|
15.10.2010, 11:43 |
16 |
public Form2(Form1 f1, string data) сколько принимает параметров? а тут —
Form2 f = new Form2(this.cooookies); ?
0 |
koc94ok 13 / 13 / 2 Регистрация: 22.04.2010 Сообщений: 637 |
||||||||
15.10.2010, 12:07 [ТС] |
17 |
|||||||
форм1:
форм2:
осталась одна ошибка:
0 |
CEO 2258 / 1248 / 57 Регистрация: 16.03.2009 Сообщений: 3,588 |
|
15.10.2010, 12:13 |
18 |
this.nnc не обьявлен в зоне видимости данного кода, определите как приватное поле
0 |
koc94ok 13 / 13 / 2 Регистрация: 22.04.2010 Сообщений: 637 |
||||
15.10.2010, 12:18 [ТС] |
19 |
|||
не обьявлен в зоне видимости данного кода, определите как приватное поле это как?
0 |
Alligieri CEO 2258 / 1248 / 57 Регистрация: 16.03.2009 Сообщений: 3,588 |
||||
15.10.2010, 12:57 |
20 |
|||
koc94ok, так он есть локальной переменной и извне не видим. надо:
обьявить
1 |
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
15.8k18 gold badges66 silver badges80 bronze badges
asked May 1, 2011 at 11:47
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 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
2,4767 gold badges45 silver badges87 bronze badges
answered Nov 18, 2016 at 12:09
1
- Remove From My Forums
Переходы между формами
-
Вопрос
-
Всем привет. Возникла такая проблема.
Есть две формы, необходимо сделать так, чтобы по клику на кнопку на первой форме — появлялась вторая, а первая скрывалась. А по клику на кнопку на второй форме — вторая закрывалась, а первая появлялась.
Пробовал делать несколькими вариантами:
Первый вариант:
//кнопка на первой форме 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
258k30 gold badges324 silver badges508 bronze badges
asked Jun 15, 2011 at 21:14
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 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
9251 gold badge14 silver badges21 bronze badges
answered Jun 15, 2011 at 21:21
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 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
2,21215 silver badges14 bronze badges
answered Jan 9, 2018 at 0:52
Assume you have Form1
and Form2
Your scope is not clear if you want
-
Switch between
Form1
andForm2
and keep both of them alive. -
Keep only either
Form1
orForm2
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.
- Create your own instance of
ApplicationContext MyAppCxt= new ApplicationContext()
. - instead of the default
Program.Run(Form1)
callProgram.Run(MyAppCxt(Form1))
-
in the handler of some event, when you need to switch the
Form1
andForm2
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
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
258k30 gold badges324 silver badges508 bronze badges
asked Jun 15, 2011 at 21:14
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 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
9251 gold badge14 silver badges21 bronze badges
answered Jun 15, 2011 at 21:21
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 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
2,21215 silver badges14 bronze badges
answered Jan 9, 2018 at 0:52
Assume you have Form1
and Form2
Your scope is not clear if you want
-
Switch between
Form1
andForm2
and keep both of them alive. -
Keep only either
Form1
orForm2
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.
- Create your own instance of
ApplicationContext MyAppCxt= new ApplicationContext()
. - instead of the default
Program.Run(Form1)
callProgram.Run(MyAppCxt(Form1))
-
in the handler of some event, when you need to switch the
Form1
andForm2
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
Добавление форм. Взаимодействие между формами
Последнее обновление: 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.
Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.