Как связать 2 формы windows forms

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

В Form1.cs:

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)
    {
        e.Cancel = true;
        Hide();
    }

Далее другой пример, который касается взаимодействия дочерней формы и родительской.
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");
        }

    }
}

Form2.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 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.

Добавление форм. Взаимодействие между формами

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

maksimkalon

10 / 9 / 7

Регистрация: 03.03.2013

Сообщений: 71

1

Связать две формы

03.03.2013, 13:55. Показов 37696. Ответов 11

Метки нет (Все метки)


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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Form2 form2 = new Form2();
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            form2.ShowDialog();
        }
    }
}

Form2

C#
1
2
3
4
5
6
7
8
9
10
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        private Form2 form2 = new Form2();
        public Form2()
        {
            InitializeComponent();
        }
тра-та-та

Выдает ошибку на

C#
1
private Form2 form2 = new Form2();

An unhandled exception of type ‘System.StackOverflowException’ occurred in SCALABLEFORM.exe

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



60 / 60 / 17

Регистрация: 09.06.2009

Сообщений: 117

03.03.2013, 14:04

2



1



2 / 2 / 3

Регистрация: 04.12.2012

Сообщений: 75

03.03.2013, 15:04

3

в Form2
нужно нужно обьявить форму там, где вы будете её использовать..
http://rghost.ru/44236660

Не по теме:

Как заливать файлы на форум?



1



27 / 27 / 8

Регистрация: 30.03.2010

Сообщений: 380

Записей в блоге: 1

04.03.2013, 03:46

4

Цитата
Сообщение от Doc_Vasia
Посмотреть сообщение

Не по теме:

Как заливать файлы на форум?

зайти в расширенный режим и нажать на кнопку в виде скрепочки…далее думаю разберётесь)))



0



10 / 9 / 7

Регистрация: 03.03.2013

Сообщений: 71

04.03.2013, 07:37

 [ТС]

5

Спасибо большое, разобрался



0



maksimkalon

10 / 9 / 7

Регистрация: 03.03.2013

Сообщений: 71

06.03.2013, 09:27

 [ТС]

6

Еще вопрос, как обратиться к компонентам одной формы из другой формы. Например, я из первой формы хочу узнать значение TextBox1 второй формы. Делал как написано здесь:

Цитата
Сообщение от Vitalii
Посмотреть сообщение

Почитайте здесь : Ответы на 7 самых частых вопросов по WinForms

пункт 2.5 «Родитель», но не получилось. Вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class Form1 : Form
    {
        public Form1()
        {
            
            InitializeComponent();
        }
 
        public void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Owner = this;
            form2.Show();
        }
...
C#
1
2
3
4
5
6
7
8
public partial class Form2 : Form
    {
        public Form2()
        {
            Form1 main = this.Owner as Form1;
            InitializeComponent();
        }
...



0



kontuPauk

308 / 306 / 125

Регистрация: 29.01.2013

Сообщений: 638

Записей в блоге: 1

06.03.2013, 11:25

7

Надо все-таки и мне почитать, что в faq пишут. Я делал у Form2 свойство, к которому обеспечивался доступ

C#
1
2
3
4
5
6
7
8
9
10
11
... class Form2 : Form
{
    // ...
 
    public string TextINeed
    {
       get { return textBox1.Text; }
    }
 
   // ...
}

Ну и в нужном месте первой формы

C#
1
2
3
Form2 form = new Form2();
// ...
string text = form.TextINeed;



0



10 / 9 / 7

Регистрация: 03.03.2013

Сообщений: 71

13.03.2013, 08:50

 [ТС]

8

Нужно именно из второй формы изменять значения компонентов первой



0



27 / 27 / 8

Регистрация: 30.03.2010

Сообщений: 380

Записей в блоге: 1

13.03.2013, 13:35

9

во первых в первой форме, у нужного компонента изменяете свойство Modifiers на public
во вторых во второй форме объявляете Form1 frm;
в третьих в нужном месте инициализируете новый экземпляр формы

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

в четвёртых прописываете к примеру

Код

frm.textbox1.text = "Любой текст";

либо что то другое, в зависимости от того, что вы хотите сделать



0



maksimkalon

10 / 9 / 7

Регистрация: 03.03.2013

Сообщений: 71

14.03.2013, 12:40

 [ТС]

10

Не получается

Form1

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
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
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Show();
        }
    }
}

Form2

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
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 Form2 : Form
    {
        Form1 frm;
        public Form2()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            frm = new Form1();
            frm.textBox1.Text = "1234";
        }
    }
}



0



Slicker

49 / 49 / 12

Регистрация: 18.01.2013

Сообщений: 169

14.03.2013, 13:25

11

Лучше сделать через отдельный класс

Как-то так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication4
{
    static class Data
    {
        public delegate void ValueChangedEventHandler(object sender, EventArgs e);
        public static event ValueChangedEventHandler ValueChanged;
        private static String buffer = String.Empty;
        public static String Value
        {
            get
            {
                return buffer;
            }
            set
            {
                buffer = value;
                ValueChanged(null, EventArgs.Empty);
            }
        }
    }
 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Data.ValueChanged += (sender1, e1) =>
            {
                textBox1.Text = Data.Value;
            };
 
            Form2 f2 = new Form2();
            f2.Show();
        }
 
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WindowsFormsApplication4;
namespace WindowsFormsApplication4
{
    public partial class Form2 : Form
    {
 
        public Form2()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Data.Value = "111";
        }        
    }
}



0



27 / 27 / 8

Регистрация: 30.03.2010

Сообщений: 380

Записей в блоге: 1

14.03.2013, 14:17

12

в первой форме, у нужного компонента изменяете свойство Modifiers на public

это сделали?…



0



Possible Duplicate:
how to “dock”/attach winforms forms

I have two forms: MainForm and PanelForm.

I have set it up so that PanelForm is attached to MainForm by overriding the OnMove of the MainForm so that the PanelForm moves along with the MainForm. This is to simulate that PanelForm is a panel for the MainForm.

I can dock and undock and PanelForm from the MainForm, as well as collapse it.

The problem is when I minimize the the MainForm or it loses focus to some other application, and when I return to the MainForm, I have to manually Alt-Tab the PanelForm.

Is there a way to just attach the PanelForm to MainForm, without overriding OnMove or other things to simulate that it is attached?

Community's user avatar

asked Jul 16, 2012 at 19:23

Geo P's user avatar

4

You can not have two «active» forms/windows at the same time. However you can bring one or more windows to the foreground by activating your main window. To do this use the Form.Show(ownerForm) override.

answered Jul 16, 2012 at 19:48

Sam Axe's user avatar

Sam AxeSam Axe

32.9k9 gold badges55 silver badges87 bronze badges

0

It sounds like you are experiencing the nature of forms. They are inherently independent. Maybe what you should do to ensure both forms are visible when you want them to be after they were previously hidden (minimized/another window in front of it) is to set focus to both of them successively

EDIT
Looks Like you already found an answer, but this could work too. Not as pretty as the accepted answer though. Just do it on both forms.

Timer timer;
bool resetting = false;
Form2 frm2;
public Form1()
{
    InitializeComponent();
    frm2 = new Form2();
    frm2.Show();
    timer = new Timer();
    timer.Interval = 50;
    timer.Tick+=new EventHandler(timer_Tick);
}
private void timer_Tick(object sender, EventArgs e)
{
    timer.Stop();
    resetting = false;
}

private void Form1_Activated(object sender, EventArgs e)
{
    if (!resetting)
    {
        timer.Start();
        frm2.Focus();
        this.Focus();
        resetting = true;
    }
}

answered Jul 16, 2012 at 19:44

Brad's user avatar

BradBrad

11.8k4 gold badges43 silver badges70 bronze badges

2

Possible Duplicate:
how to “dock”/attach winforms forms

I have two forms: MainForm and PanelForm.

I have set it up so that PanelForm is attached to MainForm by overriding the OnMove of the MainForm so that the PanelForm moves along with the MainForm. This is to simulate that PanelForm is a panel for the MainForm.

I can dock and undock and PanelForm from the MainForm, as well as collapse it.

The problem is when I minimize the the MainForm or it loses focus to some other application, and when I return to the MainForm, I have to manually Alt-Tab the PanelForm.

Is there a way to just attach the PanelForm to MainForm, without overriding OnMove or other things to simulate that it is attached?

Community's user avatar

asked Jul 16, 2012 at 19:23

Geo P's user avatar

4

You can not have two «active» forms/windows at the same time. However you can bring one or more windows to the foreground by activating your main window. To do this use the Form.Show(ownerForm) override.

answered Jul 16, 2012 at 19:48

Sam Axe's user avatar

Sam AxeSam Axe

32.9k9 gold badges55 silver badges87 bronze badges

0

It sounds like you are experiencing the nature of forms. They are inherently independent. Maybe what you should do to ensure both forms are visible when you want them to be after they were previously hidden (minimized/another window in front of it) is to set focus to both of them successively

EDIT
Looks Like you already found an answer, but this could work too. Not as pretty as the accepted answer though. Just do it on both forms.

Timer timer;
bool resetting = false;
Form2 frm2;
public Form1()
{
    InitializeComponent();
    frm2 = new Form2();
    frm2.Show();
    timer = new Timer();
    timer.Interval = 50;
    timer.Tick+=new EventHandler(timer_Tick);
}
private void timer_Tick(object sender, EventArgs e)
{
    timer.Stop();
    resetting = false;
}

private void Form1_Activated(object sender, EventArgs e)
{
    if (!resetting)
    {
        timer.Start();
        frm2.Focus();
        this.Focus();
        resetting = true;
    }
}

answered Jul 16, 2012 at 19:44

Brad's user avatar

BradBrad

11.8k4 gold badges43 silver badges70 bronze badges

2

Многие, кто начинал изучение WinForm приложений, сталкивались с проблемой обмена данными между окнами программы. Обмен данными между формами сводится к трем основным принципам: передача параметров в форму, получение данных из формы, изменение значений другой формы. Начнем по порядку.

1) Передача параметров в форму. Любой класс, должен иметь конструктор, и WinForm в этом случае не исключение. А следовательно очевидным является тот факт, что передача данных необходимых для инициализации формы необходимо проводить именно через конструктор формы. Приведем пример.

Создадим WinForm и перейдем к коду. Наблюдаем следующую картину:

public partial class Form1 : Form
    {
        public Form1() // <-- Конструктор формы по умолчанию
        {
            InitializeComponent();
        } }

Допустим на данной форме размещен элемент textBox в который мы хотим установить значение, при открытии нашей формы. Тогда модифицируем наш код следующим образом:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        } 
        public Form1(string text) // <-- Новый конструктор формы
        {
            InitializeComponent();
            textBox.Text = text;
        }
    }

Важно: Все действия, выполняемые с объектами формы должны быть произведены после функции InitializeComponent()!

2-3) По сути задача получения данных из формы и изменение данных в форме сводистя к одной задаче. Пусть у нас есть две формы Form1 и Form2. В первой форме у нас есть три кнопки: open, read, write . Первая откроет вторую форму, в которой есть элемент textBox, Вторая покажет сообщение с текстом, введенным в textBox формы номер два, третья очистит textBox из Form2. Имеем:

public partial class Form1 : Form
    {
        private Form2 F2 = new Form2();
 //<--Объявляем форму два как элемент класса формы один

        public Form1()
        {
            InitializeComponent();
        }
        private void open_Click(object sender, EventArgs e)
        {
            F2.ShowDialog();
        }
        private void read_Click(object sender, EventArgs e)
        {
            MessageBox.Show(F2.textBoxValue);
        }
        private void write_Click(object sender, EventArgs e)
        {
            F2.textBoxValue = String.Empty;
        }
    }

    public partial class Form2 : Form
    {
        public string textBoxValue
//<--Данная конструкция позволяет получить доступ
//к private элементам формы
        {
            get { return textBox.Text; }
            set { textBox.Text = value; }
        }
        public Form2()
        {
            InitializeComponent();
        }
    }

Вот и все. Оказалось не все так сложно 😉

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

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

например:

Form1 : Form {
public Button button1;
}

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

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

→ Ссылка

Автор решения: LinuxFan

В Form1.cs:

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)
    {
        e.Cancel = true;
        Hide();
    }

Далее другой пример, который касается взаимодействия дочерней формы и родительской.
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");
        }

    }
}

Form2.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 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.

→ Ссылка

Автор решения: Lotm

Спасибо за статью! В Делфи и правда всё было достаточно просто, а тут пришлось немного повозиться и покопаться. И вот, наконец — заработало! Вообще, есть, конечно, и другие способы, но этот мне кажется наиболее простым и удобным. Про передачу параметров через события и делегаты я вообще молчу — это не для новичков.
Так что данный вариант отлично подходит для тех, кому нужно просто, быстро и понятно.

→ Ссылка

Автор решения: Evgeniy Miroshnichenko

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

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

ПРИМЕР:

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

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

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

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

    formСhild.Dispose();

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

→ Ссылка

Понравилась статья? Поделить с друзьями:
  • Как сбросить учетную запись майкрософт на windows 10 без входа
  • Как связать 2 ноутбука по wifi windows 10
  • Как сбросить установленные обновления в windows 10
  • Как связать 2 компьютера по локальной сети через роутер windows 10
  • Как сбросить установку обновлений windows 10