MDI父窗体问题设置父级。

3

我正在使用一个具有子窗体的MDI父窗体,当这些子窗体被父窗体调用时它们显示得很好,并且我使用以下方式来实例化子窗体:

ChildForm child = new ChildForm();
child.IsMdiContainer= this;
child.Show();

如果我从父控件中调用它们,它们就能很好地工作,但如果我从另一个不是任何父窗体的子窗体中调用它们,它们就不再是主父窗体的子窗体了。一个显而易见的原因是,当我在独立窗体上启动它们时,我不能简单地使用 child.MDIParent = this;,因为这会使独立窗体成为父窗体,但我也尝试过其他方法。

MDIParentForm form = new MDIParentForm 

ChildForm child = new ChildForm();
child.IsMdiContainer= form ;
child.Show();

但这并没有帮助,反而抛出了一个异常,提示我正在尝试设置父级的表单不是MDI容器。于是我尝试进行修改。

MDIParentForm form = new MDIParentForm ;
form.IsMdiContainer= true;
ChildForm child = new ChildForm();
child.MDIParent = form ;
child.Show();

在其结果中没有任何东西出现

有什么想法如何......

4个回答

8
要从另一个子元素创建子元素,只需像这样编写代码:

ChildForm sibling = new ChildForm();
sibling.MdiParent = this.MdiParent;
sibling.Show();

或者触发一个自定义事件,供父级响应。

好的,这个可以正常工作,但是如果你要调用子表单的话,假设这个表单没有任何父级,比如从一个父级弹出一个消息框,但它不是该表单的子级,那么应该采取什么方案呢? - Afnan Bashir
有很多种方法。通过表单构造函数传递父引用是一种明显的方法。甚至Application.OpenForms[0]也可以工作。或者给父级一个静态属性,应该只有一个MDI父级。让父级负责创建子项是最好的方法。我提到的那个自定义事件。或者是ShowDialog()返回值。 - Hans Passant

0

在父表单中编写这段代码...

childform  obj = new childform( );
               obj.MdiParent = this;
               obj.StartPosition = FormStartPosition.CenterScreen;
               obj.Show( );

0

你应该将父窗体设置为已经存在的mdiform,而不是创建一个新的。

如果还没有mdiform的实例,你不仅需要创建一个窗体实例,还需要显示它。

var mdiForm = new MdiForm();
mdiForm.IsMdiContainer = true;
var childForm = new ChildForm();
childForm.MdiParent = mdiForm;
mdiForm.Show();
childForm.Show();

另外请注意,我使用了mdiForm.IsMdiContainer,据我所知,没有IsMdiParent属性。

是的,我在属性名称上犯了错误。我尝试了您的代码,但没有帮助我。相反,它显示了一个具有双控制框的新表单对话框。 - Afnan Bashir
我的代码显示了一个新窗体,因为它创建了一个MdiForm的新实例。如果MdiForm的实例已经存在,则应该将Parent属性设置为已经存在的MdiForm,就像我在第一句话中所说的那样。 - comecme

0
class MainClass
{
   public string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
   public void showWindow(Form openWin, Form closeWin, Form MDI)
    {
        closeWin.Close();
        openWin.WindowState = FormWindowState.Minimized;
        openWin.MdiParent = MDI;
        openWin.Show();
    }
}

1
嗨@Obeng,你能给你的答案添加一些解释吗? - faceman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接