Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MDI父窗体设置父窗体时出现问题_C#_Visual Studio 2010_Mdichild_Mdiparent - Fatal编程技术网

C# MDI父窗体设置父窗体时出现问题

C# MDI父窗体设置父窗体时出现问题,c#,visual-studio-2010,mdichild,mdiparent,C#,Visual Studio 2010,Mdichild,Mdiparent,我使用的是一个MDI父窗体,它有一个child,当这个父窗体调用它们时,它们显示得非常好,我使用它来强化子窗体 ChildForm child = new ChildForm(); child.IsMdiContainer= this; child.Show(); 从父控件调用它们时效果很好,但如果我从不是任何父窗体的子窗体的另一个窗体调用它们,则它们不再是主父窗体的子窗体。一个明显的原因是,当我在该独立窗体上强化它们时,我根本无法使用child.mdiprent=此;因为这会使我从父母那里独

我使用的是一个MDI父窗体,它有一个child,当这个父窗体调用它们时,它们显示得非常好,我使用它来强化子窗体

ChildForm child = new ChildForm();
child.IsMdiContainer= this;
child.Show();
从父控件调用它们时效果很好,但如果我从不是任何父窗体的子窗体的另一个窗体调用它们,则它们不再是主父窗体的子窗体。一个明显的原因是,当我在该独立窗体上强化它们时,我根本无法使用child.mdiprent=此;因为这会使我从父母那里独立出来,但我也尝试过

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();
结果什么也没有出现


任何关于如何………

的想法都应该将父级设置为已经存在的mdiform,而不是创建新mdiform

如果还没有mdiform的实例,您不仅应该创建该表单的实例,还应该显示它

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

还请注意,我使用了
mdiForm.IsMdiContainer
,因为这里没有
IsMdiParent
属性。

要从另一个子级创建子级,只需这样编写:

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

或者触发父级可以响应的自定义事件。

在父级窗体中编写此代码

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

是的,我在属性名称上出错。我试图执行您的代码,但没有帮助我。相反,它显示了一个新窗体对话框,其中包含双控件框。我的代码显示了一个新窗体,因为该代码创建了MdiForm的新实例。如果MdiForm的实例已存在,则应将父属性设置为已存在的MdiForm,就像我在第一句中说的。好吧,这很好,但是如果你要给孩子打电话的表单没有任何家长呢?让我们说,从家长那里有一个弹出消息,它不是该表单的孩子,那么应该采用什么方案呢。通过表单的构造函数传递对父级的引用是一种显而易见的方法。甚至Application.OpenForms[0]也可以工作。或者给父对象一个静态属性,则应该只有一个MDI父对象。让父母照顾孩子是最好的办法。我提到的那个定制活动。或者ShowDialog()返回值。Hi@Obeng您能为您的答案添加一些解释吗?
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();
    }
}