Форма MDI в родительском и дочернем C #

#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();

    }