работа с тремя winforms, как mdi parent и child - PullRequest
0 голосов
/ 23 марта 2011

у меня 3 формы-Форма 1,2,3. Form1 - это MdiContainer. Теперь, когда кнопка в Form1 нажата, она показывает Form2, а в Form2, когда кнопка нажата, тогда она показывает Form3. мой код, как показано ниже, но он дает ошибку, что Form2 не MdiContainer. но если я создаю Form2 как MdiContainer, тогда выдается ошибка, что Form2 - MdiChild и не может быть MdiContainer

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.Show();
        f2.MdiParent = this;
    }
}

public partial class Form2 : Form

{
    public Form2()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {

        Form3 f3 = new Form3();
        f3.Show();
        f3.MdiParent = this;
    }
}

как это сделать?

Короче говоря, я хочу это: Родителем Form2 является Form1, и, Родителем Form3 является Form2

Ответы [ 5 ]

2 голосов
/ 23 марта 2011

Вы не можете.Вы можете иметь только одного родителя MDI.В этом родительском контейнере может быть много дочерних форм, но эти формы могут порождать только другие формы напрямую, а не как дочерние MDI.

Другими словами Microsoft:

Реализация Microsoft Windowsмногодокументного интерфейса (MDI) не поддерживает вложенные окна клиента MDI.Другими словами, ни окно клиента MDI, ни дочернее окно MDI не могут иметь окно клиента MDI в качестве дочернего.

1 голос
/ 23 марта 2011

Я попытался написать следующим образом без

 f2.MdiParent = this;

Код работает

Если вы хотите обойтись без showdialog, напишите следующее на Button_click

bool IsOpen = false;
foreach (Form f in Application.OpenForms)
{
    if (f.Text == "Form2") //  Name of the Form
    {
        IsOpen = true;
        f.Focus();
        break;
    }
}
if (IsOpen == false)
{
    Form2 f2 = new Form2();
   //f2.MdiParent = this;
    f2.Show();
}
1 голос
/ 23 марта 2011

В основном эта функциональность не поддерживается, однако вы можете скопировать ее другими способами. Это просто для визуального представления, что вы хотите, чтобы f2 был родителем f3? Я пытаюсь понять, чтобы дать вам правильный ответ. Так чего вы хотите достичь? Если вы хотите, чтобы f3 встраивался в f2, вы можете создать пользовательский элемент управления и добавить его в качестве элемента управления в форму.

Если вы хотите, чтобы f3 всплывала, вы можете использовать

f3.showdialog();

Если вы сделаете это, не указывайте mpiparent для f3.

Eric

1 голос
/ 23 марта 2011

Это не будет работать, потому что Form2 не является контейнером MDI.

0 голосов
/ 23 марта 2011

В приложении только один MdiContainer, а другие должны быть дочерними формами.

Однако вы можете приблизительно достичь своей функциональности, набрав ShowDialog вместо Show()

private void button1_Click(object sender, EventArgs e)
{
    Form3 f3 = new Form3();
    f3.ShowDialog();
}

Редактировать 1 Благодаря вашим комментариям решение, предоставленное @ Dorababu , лучше всего подходит для вас с некоторыми улучшениями;сделал form1 в качестве родителя form3.Таким образом, ваша форма 3 будет отображаться внутри MdiParent.

private void button1_Click(object sender, EventArgs e)
{
    Form3 f3 = new Form3();
   //f3.MdiParent = this;
    // instead use this.MdiParent
    f3.MdiParent = this.MdiParent;
    f2.Show();
}

И проверить получение focus события формы 2, если отображается form3, затем установить фокус на form3, чтобы форма 2 не была сфокусированапока форма 3 не будет открыта.

private void Form2_Activated(object sender, EventArgs e)
{
    // inside Focus event of Form2
    foreach (Form f in Application.OpenForms)
    {
        if (f.Text == "Form3") //  Name of the Form
        {
            f.Focus();
            break;
        }
    }
}
...