Перейти к содержимому

Как связать две формы в c

  • автор:

Можно ли как то связать 2 формы между собой?

Всем доброго дня, хотел бы узнать можно ли каким то образом связать 2 фомы? То есть, мне нужно из datagridview (которая находится в 1 форме), взять информацию и занести ее в combobox (который находится во второй форме). Есть ли такая возможность?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как связать между собой 3 формы?
Мне нужно, чтобы можно было передавать сообщения между 3 формами. Так вот у меня получилось.

Как на основной форме связать между собой еще 2 подчененные формы?
Кто с таким сталкивался подскажите. База на SQL2000 Испльзую ADP Итак есть одна основная.

Нужно связать две формы между собой, так, чтобы одна показывала размер другой
Пожалуйста, прошу, помогите! Как связать две формы: изменяешь размер одной а другая тут же.

Как связать МК между собой?
Хочу связать 8 маленьких МК ATtiny2313 с одним большим ATmega16. Учитывая то, что знания у меня.

145 / 136 / 31
Регистрация: 05.03.2013
Сообщений: 742
Привет! Можно, примерно так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
//В первой форме - вызов второй с передачей ссылки на первую Form2 f2 = new Form2; f2.TransForm(this); f2.ShowDialog(); //Во второй //Метод передачи ссылки private Form1 tForm1; public void TransForm(Form1 _tForm1) { this.tForm1 = _tForm1; } //Когда нужно обращаемся к первой из второй if (tForm1 != null) { tForm1.textBox1.Text ="Текст"; tForm1.MyReloadMethod(); }

4019 / 3468 / 747
Регистрация: 13.04.2015
Сообщений: 8,016
Регистрация: 03.05.2021
Сообщений: 70

А как быть, если у мне не нужен вызов формы. У меня есть одна главная форма (навигация по формам через кнопки) и две, в одной dgv, в другой combobox?

145 / 136 / 31
Регистрация: 05.03.2013
Сообщений: 742
Вместо this

f2.TransForm(this); f2.ShowDialog();

Из главной формы, когда будете вызывать форму dgv
Передайте ссылку на форму combobox.
На сколько я понял — формы dgv и combobox открыты одновременно.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как связать между собой 3 класса
Подскажите пожалуйста, как можно связать между собой 3 класса.

Как связать между собой TListView
Всем доброй ночи. Пишу курсач на ночь глядя и некоторые аспекты меня волнуют. В общем у меня.

Как связать между собой справочники?
можно как то задать связи что бы у одной таблицы было несколько разных связей из разных.

Как связать функции между собой
У меня не работает анимация кнопки, не знаю в чём проблема, думаю это из-за того, что функция.

Как связать таблицы между собой?
Здравствуйте, имеется такая схема, скажите пожалуйста, как связать эти таблицы между собой? не могу.

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

Управление одной формой из другой

Иногда бывает нужно обратиться к элементам какой-то формы из другой в процессе выполнения программы. Например, есть форма 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 >> >

Как связать две формы в c#. Добавление форм. Взаимодействие между формами. Добавление логики для открытия формы сведений

Это ясно, что если создать указатель типа ::Form будет работать, но мне нужна уже созданная форма, с кнопками и т.п. (в общем разными контролами), а вручную (т.е. программно) прописывать их на чистой форме мне не хочеЦЦа (много писанины и не факт, что получиЦЦа так как надо). Меня еще смущает вот что. Когда я добавлял форму к уже созданному проекту, в новом заголовочном файле Form2.h было написано так:

#pragma once
#include «Form1.h»

using namespace System;

using namespace System::Data;

///
/// Summary for Form2

public ref class Form2: public System::Windows::Forms::Form
public:
Form2(void)
InitializeComponent();

///
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L»Form2″;
this->Padding = System::Windows::Forms::Padding(0);
this->
>
#pragma endregion
>;
>

хотя в Form1.h написано так:

#pragma once
#include «Form2.h»

Using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

///
/// Summary for Form1
/// WARNING: If you change the name of this class, you will need to change the
/// «Resource File Name» property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,
/// the designers will not be able to interact properly with localized
/// resources associated with this form.
public ref class Form1: public System::Windows::Forms::Form
public:
Form1(void)
InitializeComponent();
//TODO: Add the constructor code here
>

Protected:
/// Clean up any resources being used.
~Form1()
if (components)
delete components;
>
>
private: System::Windows::Forms::Button^ button1;
protected:

Private:
/// Required designer variable.
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
void InitializeComponent(void)
this->button1 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
// button1
this->button1->Location = System::Drawing::Point(60, 76);
this->button1->Name = L»button1″;
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L»button1″;
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
// Form1
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 266);
this->Controls->Add(this->button1);
this->Name = L»Form1″;
this->Text = L»Form1″;
this->ResumeLayout(false);

Static System::Windows::Forms::Form ^frm = gcnew System::Windows::Forms::Form();
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) frm->Show();
>
>;
>

В РАЗНЫХ МЕСТАХ ПРОПИСАНО ПОДКЛЮЧЕНИЕ ПРОСТРАНСТВА ИМЕН!

Если у вас есть длинная форма для нескольких элементов, иногда может потребоваться быстро выполнить детализацию данных, чтобы просмотреть дополнительные сведения об одном из элементов. В Access для этого нужно установить связь между формой для нескольких элементов и формой отдельного элемента. При выборе элемента в форме для нескольких элементов откроется форма отдельного элемента, в которой будут показаны дополнительные сведения.

Создание форм

В большинстве случаев две формы в детализированной конфигурации основаны на одной таблице или запросе. Если у вас уже есть пара форм, необходимых для использования (одна из которых — таблица или форма для нескольких элементов, а другая — форма отдельного элемента или форма сведений), вы можете пропустить этот раздел. В противном случае используйте следующие процедуры для их создания.

Создание формы таблицы или формы с несколькими элементами

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

Выберите пункты Создание > Другие формы , а затем — Несколько элементов или Таблица в зависимости от нужного типа формы.

Сохраните и закройте форму.

Дополнительные сведения о формах для нескольких элементов см. в статье Создание формы с использованием инструмента «Несколько элементов» .

Создание формы отдельного элемента или формы сведений

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

Выберите пункты Создание > Форма .

Внесите необходимые изменения, сохраните и закройте форму.

Дополнительные сведения см. в статье Создание формы с помощью инструмента «Форма» .

Добавление логики для открытия формы сведений

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

Не беспокойтесь, если у вас мало опыта работы с макросами. Вы можете просто скопировать и вставить XML-код из процедуры, указанной в этой статье.

Если вы используете форму таблицы, дважды щелкните ее в области навигации, чтобы открыть ее. В случае формы для нескольких элементов щелкните ее правой кнопкой мыши в области навигации и выберите пункт Режим макета .

Нажмите клавишу F4, чтобы открыть окно свойств, если оно еще не открыто.

Щелкните столбец, в который нужно добавить макрос. Это должен быть столбец, при щелчке которого будет открываться форма сведений после выполнения макроса. На рисунке выше макрос добавлен в столбец frmContactList.

Совет: (СОВЕТ.) Можно добавить макросы в несколько столбцов.

Дополнительные сведения о макросах в базах данных на компьютере см. в статье

Последнее обновление: 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)

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

Итак перейдем ко второй форме и перейдем к ее коду — нажмем правой кнопкой мыши на форму и выберем 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. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.

Вопросы о том, как открыть незнакомый формат файла, рано или поздно.

Компьютера с помощью стандартной программы «check disk (chkdsk)».

У меня ноутбук. Загрузилась с загрузочного диска. Что выбрать, что бы.

Как связать две формы?

Хочу работать с двумя и более формами в C#. Для начала было бы интересно знать как связать две формы, чтобы из одной можно было бы обращаться к элементам другой.

Отслеживать
задан 11 дек 2011 в 14:03
690 7 7 золотых знаков 21 21 серебряный знак 51 51 бронзовый знак
Тоже интересует этот вопрос.
11 дек 2011 в 14:16

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

из Form1:
Form2 frm = new Form2(); frm.label1.Text = «hello»; frm.Show();

Отслеживать
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков
ответ дан 11 дек 2011 в 15:10
176 2 2 бронзовых знака
ВОТ! ВОТ ТО ЧТО Я ДОЛГО ИСКАЛ. Спасибо.
11 дек 2011 в 15:22
Ага спасибо! Попробуем.
11 дек 2011 в 15:37
тут немного неправильно, так как при каждом нажатии на кнопку будет создаваться новое окно с лейбом
11 дек 2011 в 16:01
А как будет правильно?
11 дек 2011 в 16:14

public partial class Form1 : Form < public Form1() < InitializeComponent(); frm2 = new Form2(); >Form2 frm2; private void button1_Click(object sender, EventArgs e) < frm2.Show(); >> 

Так как после закрытия формы Form2 она уничтожается, то я переопределяю метод для закрытия — OnClosing. Нужно зайти в конструктор формы Form2. В свойствах формы найти значок с молнией. В списке найти FormClosing и кликнуть дважды на пустое поле справаот него. В редакторе кода появится новый метод, в котором я пишу следующее:

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

Далее другой пример, который касается взаимодействия дочерней формы и родительской. Form1.cs:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace childform < public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Form2 tempDialog = new Form2(this); tempDialog.ShowDialog(); >public void msgme() < MessageBox.Show("Parent Function Called"); >> > 
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace childform < public partial class Form2 : Form < private Form1 m_parent; public Form2(Form1 frm1) < InitializeComponent(); m_parent = frm1; >private void button1_Click(object sender, EventArgs e) < m_parent.msgme(); >> > 

В результате должен появиться мессаджбокс с сообщением «Parent Function Called». Если нужно обратиться к элементу формы, не забываем указывать видимость, так как по умолчанию она Private, то есть элемент не доступен извне. В конструкторе у свойства элемента устанавливаем Modifiers -> Public.

Отслеживать
ответ дан 11 дек 2011 в 16:27
231 2 2 серебряных знака 9 9 бронзовых знаков

Спасибо. А как закрыть первую форму, при нажатии на кнопку? Я делаю this.Close и закрывается вся программа.

11 дек 2011 в 16:39

@Святослав Правильно, ведь Form1 это родительская форма. Если нужно убрать с экрана, то используйте Hide().

11 дек 2011 в 16:48
И последний вопрос. Почему когда я закрываю вторую форму, отладка не останавливается?
11 дек 2011 в 16:59

Потому что Первая форма открыта. Если ты сделал команду this.Hile(); То она просто спрятана(свернута), чтобы её закрыть используй this.Close(); Или я что-то неправильно понял в вопросе?

11 дек 2011 в 17:02

Первая форма скрыта, ее просто не видно, т.к. мы ее скрыли, но программа продолжает выполняться. Есть 2 пути: 1. В событии OnClosing второй формы вызвать Show() для первой формы. 2. В событии OnClosing второй формы вызвать Application.Exit(), тогда отладка остановится, но это будет не логично, так как обычно выход из программы делают из родительской формы.

11 дек 2011 в 17:08

На самом деле довольно просто. Экземпляр формы — это экземпляр класса, поэтому если нужен доступ снаружи к чему-то внутри формы, просто сделайте соответствующее public свойство (или поле, или метод — как вам больше нравится).

ну и самое главное, что бы экземпляры форм были в области видимости друг у друга.

ну а как обращаться, я думаю, понятно и без объяснений, правда?

Отслеживать
ответ дан 11 дек 2011 в 14:37
612 4 4 серебряных знака 12 12 бронзовых знаков

Мне нет. Вот давайте разберем на примере. у меня есть 2 формы Form1 и Form2, на Form1 есть Label, а на Form2 есть кнопка, и как сделать так чтобы при нажатии на кнопку Label на Form1, получил значение «УРА ЗАРАБОТАЛО»?

11 дек 2011 в 14:55
делаешь экземпляр класса с лейбом, а в коде с кнопкой в листерене меняешь его значение
11 дек 2011 в 15:00

@Angus123 В конструкторе формы у элемента к которому хотите обратиться выставите свойство Modifiers — Public

11 дек 2011 в 15:02
Ага спасибо помогло!
11 дек 2011 в 15:22

Для создания дочерней формы, принадлежащей главной форме, необходимо назначить свойству Owner дочернего окна ссылку на главную форму, которая будет владельцем дочернего окна.

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

 userForm formСhild = new userForm(); //создание дочерней формы formСhild.Owner = this; //назначение дочерней форме, родителя. 

*Операции выполняются внутри тела класса родительской формы к котрой присоединяется дочерняя. Производный класс userForm унаследованный от класса Form, должен быть предварительно объявлен(здесь это опущено).

Теперь, в зависимости от потребностей вы можете

  1. Доверить процесс удаления дочернего окна сборщику мусора. В данном случае оно будет удалено после закрытия главного окна (если программистом не предусмотрено другого)
  2. Выполнить контролируемое удаление дочернего окна, после наступления необходимого вам события, для этого в теле необходимого вам метода, обрабатывающего наступление какого либо нужного вам события, нужно указать: formСhild.Dispose();

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *