Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.69.152] |
|
Сообщ.
#1
,
|
|
|
Передача данных из создающей формы тривиальна - надо просто сохранять ссылку на ребёнка, то есть
Form f=new Form();//вот этот f и надо где-нибудь сохранить пока его надо использовать Естественно свойства/контролы/функции ребёнка к которым нужно обращаться надо делать public или internal В обратную сторону всё немного сложнее, но опять же ничего сверхестественного Вариант номер раз: используем Form.MdiParent: +Ничего дополнительно писать не надо -Только для MDI приложений -Нельзя использовать родителя в конструкторе ребёнка -Exception если MdiParent не того типа что подразумевается public class ParentForm:Form{ //....... public Label label; //....... public void SomeFunction(){ ChildForm cf=new ChildForm(); cf.MdiParent=this; cf.Show(); } //....... } //....... public class ChildForm:Form{ //....... private void AnotherFunction(){ ((ParentForm)MdiParent).label.Text="Matrix has you!"; } //....... } Вариант номер два: делаем конструктор дочерней формы с параметром: +Универсальность +Невозможность использования неправильным образом -Дополнительный член в классе -Нельзя использовать конструктор без параметров public class ParentForm:Form{ //....... public Label label; //....... public void SomeFunction(){ ChildForm cf=new ChildForm(this); cf.Show(); } //....... } //....... public class ChildForm:Form{ //....... //Здесь храним ссылку на родителя private ParentForm parent; public ChildForm(ParentForm p){ parent=p; } //....... private void AnotherFunction(){ parent.label.Text="Matrix has you!"; } //....... } Вариант номер три: делаем открытый член в дочерней форме: +Универсальность -Дополнительный член в классе -Не особо "красивое" решение, хотя кого это волнует -Нельзя использовать родителя в конструкторе public class ParentForm:Form{ //....... public Label label; //....... public void SomeFunction(){ ChildForm cf=new ChildForm(); cf.parent=this; cf.Show(); } //....... } //....... public class ChildForm:Form{ //....... //Здесь храним ссылку на родителя public ParentForm parent; //....... private void AnotherFunction(){ parent.label.Text="Matrix has you!"; } //....... } Вариант номер четыре: используем паттерн "singleton" +Универсальность +Невозможность использования неправильным образом +Использование паттерна проектирования -Дополнительный член в классе -Нельзя создавать несколько родителей public class ParentForm:Form{ //....... //Единственный экземпляр формы. Естественно его надо инициализзировать public static ParentForm Instance; //Варианты инициализации: //1 - при создании public static void Main(){ Application.Run(ParentForm.Instance=new ParentForm()); } //2 - в конструкторе public ParentForm(){ ParentForm.Instance=this; //....... } //3 - в статическом конструкторе static ParentForm(){ Instance=new ParentForm(); //В этос варианте больше нигде нельзя делать new ParentForm //Например в Main надо написать: // Application.Run(ParentForm.Instance); } //....... public Label label; //....... public void SomeFunction(){ ChildForm cf=new ChildForm(); cf.Show(); } //....... } //....... public class ChildForm:Form{ //....... private void AnotherFunction(){ ParentForm.Instance.label.Text="Matrix has you!"; } //....... } Естественно во всех случаях не забываем о модификаторах доступа, иначе компилятор напомнит |
Сообщ.
#2
,
|
|
|
Цитата andrey @ Вариант номер два: делаем конструктор дочерней формы с параметром: +Универсальность +Невозможность использования неправильным образом -Дополнительный член в классе -Нельзя использовать конструктор без параметров "-Нельзя использовать конструктор без параметров" - МОЖНО! Конструктор можно перегрузить и создавать экземпляр как с параметрами, так и без них. |
Сообщ.
#3
,
|
|
|
а не проще отдавать формам property (OtherForm as System.Windows.Forms) а потом приводить
как (OtherForm as System.Windows.Forms).RunSomeMethod ? |