Как сделать переход на другую форму в c
Чтобы добавить еще одну форму в проект, нажмем на имя проекта в окне 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)
Теперь сделаем наоборот — чтобы вторая форма воздействовала на первую. Пока вторая форма не знает о существовании первой. Чтобы это исправить, надо второй форме как-то передать сведения о первой форме. Для этого воспользуемся передачей ссылки на форму в конструкторе.
Итак перейдем ко второй форме и перейдем к ее коду — нажмем правой кнопкой мыши на форму и выберем 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)
Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект — объект Form1, то при создании второй формы она будет получать ее (ссылку) и через нее управлять первой формой.
Теперь после нажатия на кнопку у нас будет создана вторая форма, которая сразу изменит цвет первой формы.
Мы можем также создавать объекты и текущей формы:
private void button1_Click(object sender, EventArgs e)
При работе с несколькими формами надо учитывать, что одна из них является главной — которая запускается первой в файле Program.cs. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Переход на новую форму
Подскажите плиз, как создать новую форму В С# и при нажатии кнопки чтобы переходило на эту форму.
Одна форма уже есть!!
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как загружать на форму элементы управления, не создавая новую форму?
Здравствуйте, столкнулся с вопросом в visual studio c#, как загружать на форму элементы управления.

Переход на новую строчку в Label
Как продолжить выводить текст в новой строке? Например Label.text = "aaabbb"; что нужно.
Переход на новую главу книги.
Объясните как перелистывать страницы. Есть книга,каждая глава этой книги лежит в отдельном.
Переход на новую строку в comboBox
Всем привет, подскажите, почему при вызове в комбоксе "\n " для перехода на новую строку, все.
Переход от формы к форме
Хотелось бы понять идеологию перехода на простой задаче, а то ее как то упускают из вида, наверное считая это само-собой разумеющимся.
Задача такая:
есть 3 формы, допустим абсолютно разные ос всякими контролами и примочками. Помимо этих контролов есть по 2 кнопки на форме.
Например кнопки на form1 должны отправлять на form2 и form3, скрывая form1. Аналочно для 2-х других.
Как это правильно реализовать!?
9 ответов
21 августа 2007 года
373 / / 30.04.2006
Form2 frm2 = new Form2();
frm2.Show();
this.Hide();
21 августа 2007 года
2 / / 21.08.2007
то и делал в ответ на событие баттон_клик.
Однако как вернуться обратно, причем не создавая объект формы, а пользуя тот, что уже в хайде висит!?
21 августа 2007 года
373 / / 30.04.2006
Можно его просто не хайдить. Тогда кликом мыши ) Увы, сейчас msdn под рукой нет, так что ничего конкретного сказать не могу. Но там ответ будет однозначно )
27 августа 2007 года
2 / / 27.08.2007
похожий вопрос, надо передать данные с контролов 2 формы, содание формы 2 чистая динамика, на контролы формы 1. скажем на примере textBox1 и Textbox2. на каждой форме есть по 1 экземпляру
02 сентября 2007 года
33 / / 02.09.2007
похожий вопрос, надо передать данные с контролов 2 формы, содание формы 2 чистая динамика, на контролы формы 1. скажем на примере textBox1 и Textbox2. на каждой форме есть по 1 экземпляру
Недавно сам искал ответ на этот вопрос.
Например при нажатии кнопки на второй форме пишешь в обработчик:
Form frmMain = Application.OpenForms[«Form1»];
Button btn1 = (Button)frmMain.Controls[«button1»];
btn1.Text = «новый текст»;//передаём новый текст на кнопку Form1
09 июля 2008 года
1 / / 09.07.2008
Тоже столкнулся с такой задачей, решил использованием .Handle;
и стат. класса для хранения хендлов всех используемых окон:
static public class CL
public static IntPtr F1Handle;
public static IntPtr F2Handle;
public static IntPtr F3Handle;
>
для скрытия окна:
F1Handle=F1.Handle;
this.Hide();
для его показа из любой другой формы:
наверное, для большого кол-ва окон проще использовать массив.
ой 🙂 дату не посмотрел :))
09 июля 2008 года
277 / / 11.10.2006
Помоему, все делается намного проще:-)
В Windows Forms, есть такое понятие как owner. Так вот. создавая форму, ей можно указать ее владльца, Form.owner, допустим, простой пример:
Form2 frm = new Form2();
frm.owner = this;
frm.Show();
this.Hide();
Потом, когда надо отобразить родителя формы: frm.owner.Show();
ЗЫ: за точность синтаксиса не ручаюсь, писал на ходу. Но, думаю, суть понятна 🙂
10 июля 2008 года
874 / / 21.12.2007
Вообще-то, такого рода проблемы становятся аткуальными вследствие неверного планирования бизнес-логики приложения. То, что одна форма вызывает другую форму/диалог, а сама тут же откалывается, не есть нермальный ход событий — оно и в жизни некорректно (вспомним Тома Сойера и его забор). Правильнее было бы завести класс, следящий за порядком и правилом отображения тех или иных компонентов пользователького интерфейса. Такая организация даст возможность более гибкого управления интерфейсом, а также нивелирует проблемы освобождения неиспользуемых форм/элементов управления. Конкретная же реализация зависит от поставленной задачи
Управление одной формой из другой
Иногда бывает нужно обратиться к элементам какой-то формы из другой в процессе выполнения программы. Например, есть форма 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 >> >
