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

如何将主窗体中布尔变量的状态传递至子窗体?

主窗体向子窗体传递布尔变量状态的正确方法

你的现有代码存在问题:子窗体中private MainForm mainForm = new();是创建了一个全新的主窗体实例,并非打开子窗体的那个原主窗体,因此无法获取到正确的unitConnected状态。下面是几种可行的解决方法:

方法一:通过子窗体构造函数传递参数

这是最直接的方式,创建子窗体时直接把变量值传入:

主窗体修改后代码

// 全局变量
public bool unitConnected = false;

private void buttonOpenSubForm_Click(object sender, EventArgs e)
{
    unitConnected = true;

    // 创建子窗体时传入当前的unitConnected值
    SubForm subForm = new SubForm(unitConnected);

    if (subForm.ShowDialog(this) == DialogResult.OK)
    {
        // 后续操作
    }
}

子窗体修改后代码

private bool _unitConnected;

// 重载构造函数,接收传递的布尔值
public SubForm(bool unitConnected)
{
    InitializeComponent();
    _unitConnected = unitConnected;
}

private void SubForm_Load(object sender, EventArgs e)
{
    if (_unitConnected)
    {
        // 执行对应操作
    }
}

方法二:通过子窗体的属性传递

给子窗体添加一个公共属性,创建子窗体后直接赋值:

主窗体修改后代码

public bool unitConnected = false;

private void buttonOpenSubForm_Click(object sender, EventArgs e)
{
    unitConnected = true;

    SubForm subForm = new SubForm();
    // 给子窗体的公共属性赋值
    subForm.UnitConnected = unitConnected;

    if (subForm.ShowDialog(this) == DialogResult.OK)
    {
        // 后续操作
    }
}

子窗体修改后代码

// 定义公共属性
public bool UnitConnected { get; set; }

public SubForm()
{
    InitializeComponent();
}

private void SubForm_Load(object sender, EventArgs e)
{
    if (UnitConnected)
    {
        // 执行对应操作
    }
}

方法三:利用窗体的Owner属性获取主窗体实例

因为你用ShowDialog(this)打开子窗体,主窗体就是子窗体的Owner,可以直接转换类型获取原实例:

主窗体代码(无需修改)

public bool unitConnected = false;

private void buttonOpenSubForm_Click(object sender, EventArgs e)
{
    unitConnected = true;

    SubForm subForm = new SubForm();

    if (subForm.ShowDialog(this) == DialogResult.OK)
    {
        // 后续操作
    }
}

子窗体修改后代码

public SubForm()
{
    InitializeComponent();
}

private void SubForm_Load(object sender, EventArgs e)
{
    // 将Owner转换为主窗体类型,获取原实例的变量
    MainForm mainForm = Owner as MainForm;
    if (mainForm != null && mainForm.unitConnected)
    {
        // 执行对应操作
    }
}

注意:方法三中主窗体的unitConnected是公共字段,建议改为公共属性(public bool UnitConnected { get; set; }),更符合面向对象的封装原则。

内容的提问来源于stack exchange,提问作者Slash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:55:03