You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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主窗体的引用,这种方式更可靠:

  1. 先在FrmBuscarUsuario中添加用于存储主窗体引用的属性:
// FrmBuscarUsuario类中新增属性
public mdiprincipal MdiMainForm { get; set; }
  1. 在MDI主窗体中打开FrmBuscarUsuario时,赋值主窗体引用:
// 假设这是MDI主窗体中打开FrmBuscarUsuario的代码
var buscarForm = new FrmBuscarUsuario();
buscarForm.MdiMainForm = this; // this代表当前MDI主窗体实例
buscarForm.Show();
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:43:22