include "Form2.h"
......................
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
F2 = gcnew Form2;
}
........................
private: Form2^ F2;
.........................
........................
.........................
F2->ShowDialog();
Обращение из дочерней формы к родительской
В первой форме:
Код:
Показали вторую форму.
И теперь мне при выполнении некоторых действий в появившейся второй форме необходимо обратиться к каким-то элементам первой формы. Здесь у меня возникают некоторые трудности, т.к. в Form2 нет объекта класса Form1. А если я его создаю, то я получается создаю ещё одну форму Form1, а мне нужно обратиться к уже имеющейся форме Form1.:confused: :confused: :confused:
[COLOR=teal]ContainerControl[/COLOR].ParentForm
Пример обработки нажатия кнопки в дочерней форме (С#):
Код:
[COLOR=green]// The event handler on Form2.[/COLOR]
[COLOR=blue]private[/COLOR] [COLOR=blue]void[/COLOR] button1_Click([COLOR=blue]object[/COLOR] sender, System.[COLOR=teal]EventArgs[/COLOR] e)
{
[COLOR=green]// Get the Name property of the Parent.[/COLOR]
[COLOR=blue]string[/COLOR] s = ParentForm.Name;
[COLOR=green]// Display the name in a message box.[/COLOR]
[COLOR=teal]MessageBox[/COLOR].Show([COLOR=darkred]"My Parent is "[/COLOR] + s + [COLOR=darkred]"."[/COLOR]);
}
[COLOR=blue]private[/COLOR] [COLOR=blue]void[/COLOR] button1_Click([COLOR=blue]object[/COLOR] sender, System.[COLOR=teal]EventArgs[/COLOR] e)
{
[COLOR=green]// Get the Name property of the Parent.[/COLOR]
[COLOR=blue]string[/COLOR] s = ParentForm.Name;
[COLOR=green]// Display the name in a message box.[/COLOR]
[COLOR=teal]MessageBox[/COLOR].Show([COLOR=darkred]"My Parent is "[/COLOR] + s + [COLOR=darkred]"."[/COLOR]);
}
Второе - передавать в конутруктор дочерней формы экземпляр родительской, что по мне более предпочтительно.
У меня почему-то не получилось.
Код:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
String ^s = ParentForm->Name; //[COLOR="Red"]на этой строке у меня вылетает окно с ошибкой.[/COLOR]
MessageBox::Show("My Parent is " + s + ".");
}
{
String ^s = ParentForm->Name; //[COLOR="Red"]на этой строке у меня вылетает окно с ошибкой.[/COLOR]
MessageBox::Show("My Parent is " + s + ".");
}
Цитата:
Второе - передавать в конутруктор дочерней формы экземпляр родительской, что по мне более предпочтительно.
И можно чуть подробнее с этого места?
Если можно, то на примере:rolleyes:
Код:
[COLOR=green]//подразумевается, что имеется два класса (ParentForm и ChildForm)[/COLOR]
[COLOR=blue]public partial class[/COLOR] [COLOR=teal]ChildForm : Form[/COLOR]
{
[COLOR=blue]public[/COLOR] ChildForm() [COLOR=green]//конструктор по-умолчанию, как правило мы пользуемся им.[/COLOR]
{
InitializeComponent();
}
[COLOR=blue]private[/COLOR] [COLOR=teal]ParentForm[/COLOR] m_frmParent;
[COLOR=blue]public[/COLOR] ChildForm([COLOR=teal]ParentForm[/COLOR] frmParent) [COLOR=green]//добавленный конструктор, принимающий ссылку на экземпляр объекта родительской формы[/COLOR]
{
m_frmParent = frmParent;
InitializeComponent();
}
[COLOR=blue]private void[/COLOR] btnDemoClick([COLOR=blue]object[/COLOR] Sender,[COLOR=teal]EventArgs[/COLOR] e)
{
m_frmParent.Text = [COLOR=darkred]"Hello world from child form"[/COLOR];
}
}
[COLOR=green]//В родительской форме пишем примерно так[/COLOR]
.....
[COLOR=teal]ChildForm[/COLOR] frmChild = [COLOR=blue]new[/COLOR] ChildForm([COLOR=blue]this[/COLOR]);
frmChild.ShowDialog(); [COLOR=green]//or Show();[/COLOR]
.....
[COLOR=blue]public partial class[/COLOR] [COLOR=teal]ChildForm : Form[/COLOR]
{
[COLOR=blue]public[/COLOR] ChildForm() [COLOR=green]//конструктор по-умолчанию, как правило мы пользуемся им.[/COLOR]
{
InitializeComponent();
}
[COLOR=blue]private[/COLOR] [COLOR=teal]ParentForm[/COLOR] m_frmParent;
[COLOR=blue]public[/COLOR] ChildForm([COLOR=teal]ParentForm[/COLOR] frmParent) [COLOR=green]//добавленный конструктор, принимающий ссылку на экземпляр объекта родительской формы[/COLOR]
{
m_frmParent = frmParent;
InitializeComponent();
}
[COLOR=blue]private void[/COLOR] btnDemoClick([COLOR=blue]object[/COLOR] Sender,[COLOR=teal]EventArgs[/COLOR] e)
{
m_frmParent.Text = [COLOR=darkred]"Hello world from child form"[/COLOR];
}
}
[COLOR=green]//В родительской форме пишем примерно так[/COLOR]
.....
[COLOR=teal]ChildForm[/COLOR] frmChild = [COLOR=blue]new[/COLOR] ChildForm([COLOR=blue]this[/COLOR]);
frmChild.ShowDialog(); [COLOR=green]//or Show();[/COLOR]
.....
По поводу ошибки.. скорее всего выстреливает [COLOR=teal]NullReferenceException[/COLOR][COLOR=black]. Сам не пробовал этим заниматься, но возможно спасет передача ссылки на родительское окно в метод ShowDialog()[/COLOR]
Эта тема обсуждалась.
Ap0k, можно ещё уточнить один момент?
Цитата:
//подразумевается, что имеется два класса (ParentForm и ChildForm)
public partial class ChildForm : Form
{
public ChildForm() //конструктор по-умолчанию, как правило мы пользуемся им.
{
InitializeComponent();
}
[COLOR="Red"]private ParentForm m_frmParent; //[SIZE="4"]1[/SIZE][/COLOR]
public ChildForm(ParentForm frmParent) //добавленный конструктор, принимающий ссылку на экземпляр объекта родительской формы
{
m_frmParent = frmParent;
InitializeComponent();
}
private void btnDemoClick(object Sender,EventArgs e)
{
m_frmParent.Text = "Hello world from child form";
}
}
//В родительской форме пишем примерно так
.....
ChildForm frmChild = new ChildForm(this); [COLOR="#ff0000"][SIZE="4"]//2[/SIZE][/COLOR]
frmChild.ShowDialog(); //or Show();
.....
public partial class ChildForm : Form
{
public ChildForm() //конструктор по-умолчанию, как правило мы пользуемся им.
{
InitializeComponent();
}
[COLOR="Red"]private ParentForm m_frmParent; //[SIZE="4"]1[/SIZE][/COLOR]
public ChildForm(ParentForm frmParent) //добавленный конструктор, принимающий ссылку на экземпляр объекта родительской формы
{
m_frmParent = frmParent;
InitializeComponent();
}
private void btnDemoClick(object Sender,EventArgs e)
{
m_frmParent.Text = "Hello world from child form";
}
}
//В родительской форме пишем примерно так
.....
ChildForm frmChild = new ChildForm(this); [COLOR="#ff0000"][SIZE="4"]//2[/SIZE][/COLOR]
frmChild.ShowDialog(); //or Show();
.....
Для C++
[SIZE="4"][COLOR="Red"]1[/COLOR][/SIZE]: В этой строке для того, чтобы объявить объект m_frmParent класса ParentForm нужно, как я понимаю, подключить ParentForm.h. Но как только я его подключаю, то в строке [COLOR="Red"][SIZE="4"]2[/SIZE][/COLOR] при объявлении объекта компилятор выдаёт ошибку. Но если я из ParentForm убираю строку
Код:
include "ChildForm.h"
В общем насколько я понял нельзя допускать "перекрёстного" подключения файлов, т.е. когда в файл ParentForm.h подключён файл ChildForm.h и наоборот.
Ведь именно по этой причине я и поднял этот вопрос, т.е. в родительской форме могу создать объект класса дочерней формы, а в дочерней форме экземпляр родительской создать не получается, потому что нужно подключать файл родительской формы, а в этом случае, как я уже говорил, происходит ошибка в строке [COLOR="#ff0000"][SIZE="4"]2[/SIZE][/COLOR].
Или всё-таки как-то это можно обойти?
Код для С++ отличается от C#
А обойти это никак нельзя.
Если в дочерней форме создавать ссылку на родительскую так:
Код:
Form ^F1 = Application::OpenForms["Form1"];
то почему-то public-переменных в полученной F1 не видно.
public:static ArrayList^ StateArray=gcnew ArrayList();
обычно я обращаюсь вот так
safe_cast<State^>(StateArray)->поле/метод
а как мне получить прямой доступ из другой формы которая также обявлена в этом классе и создана как обьект? Неужели всё так сложно и нельзя как в Java или как в Borland(OP,C++) обратиться напрямую.
всё я свои проблемы решил вот таким путём
http://www.gotdotnet.ru/DotNet/FAQ/WindowsForms/Form/357.aspx
Но всёравно это несовсем то что хотелось