#c# #winforms #mdi
#c# #winforms #mdi
Вопрос:
В моем проекте есть 3 формы.
form1
является ли MDI контроллеромform2
иform3
являются дочерними элементами MDI
Как мне создать form1
в качестве родительской и form2
и form3
в качестве дочерних?
Что-то вроде старого MDI-интерфейса MFC:
Представьте, что form2
является родительской и имеет кнопку. При нажатии на нее она должна открыться form3
в родительской форме ( form1
). Как мне это настроить?
Ответ №1:
Во-первых, убедитесь, что для Form1 IsMdiContainer
установлено значение true
.
Затем создайте экземпляр Form1 и Form2, установив Form1 в качестве MdiParent для Form2:
// Form1.IsMdiContainer should be true
Form1 form1 = new Form1();
// This automatically adds form2 into form1's MdiChildren collection
Form2 form2 = new Form2();
form2.MdiParent = form1;
В коде Form2 есть что-то вроде следующего для обработки события нажатия кнопки для создания экземпляра Form3.
public class Form2 : Form {
// Include as data member so we only instantiate one Form3
Form3 _form3;
public Form2() {
InitializeComponent();
Button1.Click = new EventHandler(Button1_Click);
}
private void Button1_Click(object sender, EventArgs e) {
if(_form3 == null) {
_form3 = new Form3();
// Set Form3's parent to be Form1
_form3.MdiParent = this.MdiParent;
}
}
}
Как пара замечаний, этот код действительно быстрый и грязный. В этом есть несколько нежелательных моментов, таких как соединение Form2 и Form3 (а также бесполезные имена классов Form1, Form2 и Form3). В идеале, вы бы разделили Form2 и Form3, вызвав событие из Form2, к которому может подключиться ваш контейнер forms и создать экземпляр Form3. Этот пример кода предназначен для того, чтобы дать вам направление.
Ответ №2:
Просто сообщите форме, что ее MdiParent является текущей формой.
form2 frm = new form2 ();
frm.MdiParent = this;
frm.Show();
Ответ №3:
private void homeToolStripMenuItem_Click(object sender, EventArgs e)
{
frmHome objfrmHome = frmHome.GetChildInstance();
objfrmHome.MdiParent = this;
objfrmHome.WindowState = FormWindowState.Maximized;
objfrmHome.Show();
objfrmHome.BringToFront();
}
Затем в Форме, которую вы вызываете
private static frmHome m_SChildform;
public static frmHome GetChildInstance()
{
if (m_SChildform == null) //if not created yet, Create an instance
m_SChildform = new frmHome();
return m_SChildform; //just created or created earlier.Return it
}
Ответ №4:
попробуйте эту функцию
public void mdiChild(Form mdiParent, Form mdiChild)
{
foreach (Form frm in mdiParent.MdiChildren)
{
if (frm.Name == mdiChild.Name)
{
frm.Focus();
return;
}
}
mdiChild.MdiParent = mdiParent;
mdiChild.Show();
}