Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

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

#c_sharp


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


Ответы

Ответ 1



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

Ответ 2



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

Ответ 3



На самом деле довольно просто. Экземпляр формы - это экземпляр класса, поэтому если нужен доступ снаружи к чему-то внутри формы, просто сделайте соответствующее public свойство (или поле, или метод - как вам больше нравится). например: Form1 : Form { public Button button1; } ну и самое главное, что бы экземпляры форм были в области видимости друг у друга. ну а как обращаться, я думаю, понятно и без объяснений, правда?

Ответ 4



Для создания дочерней формы, принадлежащей главной форме, необходимо назначить свойству Owner дочернего окна ссылку на главную форму, которая будет владельцем дочернего окна. Когда форма принадлежит другой форме, она закрывается или скрывается с формой владелицей. Например, рассмотрим форму Form2, которая принадлежит форме Form1. Если Form1 закрывается или сворачивается, Form2 также закрывается или сворачивается. Дочерние формы также никогда не отображаются сзади формы-владельца. ПРИМЕР: userForm formСhild = new userForm(); //создание дочерней формы formСhild.Owner = this; //назначение дочерней форме, родителя. *Операции выполняются внутри тела класса родительской формы к котрой присоединяется дочерняя. Производный класс userForm унаследованный от класса Form, должен быть предварительно объявлен(здесь это опущено). Теперь, в зависимости от потребностей вы можете Доверить процесс удаления дочернего окна сборщику мусора. В данном случае оно будет удалено после закрытия главного окна (если программистом не предусмотрено другого) Выполнить контролируемое удаление дочернего окна, после наступления необходимого вам события, для этого в теле необходимого вам метода, обрабатывающего наступление какого либо нужного вам события, нужно указать: formСhild.Dispose(); Теперь, вам нет необходимости переживать о том, что в оперативной памяти скапливаются не разрушенные вашей программой окна приложения, а также о возможных в связи с этим непредвиденных исключениях.

Ответ 5



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

Комментариев нет:

Отправить комментарий