C#:从子窗体打开FrmUsuario并设置其MDI父为FrmBuscarUsuario
解决从非MDI主窗体打开MDI子窗体的问题
你的问题核心是未正确获取MDI主窗体的有效实例,导致MdiParent属性设置无效,FrmUsuario只能以普通窗体打开。以下是两种可行的解决方案:
方案1:通过Application.OpenForms获取MDI主窗体实例
直接从当前运行的窗体集合中找到MDI主窗体的实例,适合无法提前传递主窗体引用的场景:
private void button1_Click(object sender, EventArgs e) { // 从已打开的窗体中筛选出MDI主窗体实例 var mdiPrincipal = Application.OpenForms.OfType<mdiprincipal>().FirstOrDefault(); if (mdiPrincipal != null) { FrmUsuario frmUsuario = new FrmUsuario { MdiParent = mdiPrincipal }; frmUsuario.Show(); MessageBox.Show(frmUsuario.IsMdiChild.ToString()); } else { MessageBox.Show("未找到运行中的MDI主窗体"); } }
方案2:提前传递MDI主窗体引用
在打开FrmBuscarUsuario时,主动传递MDI主窗体的引用,这种方式更可靠:
- 先在FrmBuscarUsuario中添加用于存储主窗体引用的属性:
// FrmBuscarUsuario类中新增属性 public mdiprincipal MdiMainForm { get; set; }
- 在MDI主窗体中打开FrmBuscarUsuario时,赋值主窗体引用:
// 假设这是MDI主窗体中打开FrmBuscarUsuario的代码 var buscarForm = new FrmBuscarUsuario(); buscarForm.MdiMainForm = this; // this代表当前MDI主窗体实例 buscarForm.Show();
- 在FrmBuscarUsuario的按钮点击事件中使用该引用:
private void button1_Click(object sender, EventArgs e) { if (MdiMainForm != null) { FrmUsuario frmUsuario = new FrmUsuario { MdiParent = MdiMainForm }; frmUsuario.Show(); MessageBox.Show(frmUsuario.IsMdiChild.ToString()); } else { MessageBox.Show("未设置MDI主窗体引用"); } }
问题根源说明
你原代码中的principal变量大概率未指向正在运行的MDI主窗体实例(比如可能是未初始化、或新建了一个无效的主窗体对象),导致MdiParent设置不生效,FrmUsuario只能作为普通窗体打开。
内容的提问来源于stack exchange,提问作者itamarjlosistemas Oliveira
相关产品推荐
相关产品推荐

