C# WinForms窗体间传值:Owner属性与属性封装实战

巷口听风
巷口听风
发布时间:2026-10-13| 4人浏览过
原创

在开发C# Windows Forms应用程序时,经常需要在主窗体(Parent)和子窗体(Child)之间传递数据。本文将演示如何利用属性封装结合Owner属性来实现这一功能。

基础准备与环境说明

该方法适用于标准的Visual C# Windows应用程序环境。需要注意的是,在老旧的设备应用程序(如Visual C#智能设备 Pocket PC 2003)中,ShowDialog() 方法可能没有重载版本,仅支持 FMChild.Owner = this; FMChild.ShowDialog(); 这种写法,但原理一致。

第一步:将源数据封装为公共属性

要实现跨窗体访问,首先不能直接暴露私有字段。假设在主窗体 FMMain 中有一个字符串变量 strValueA 需要传递给子窗体,应将其改写为公共属性:

// 在主窗体 FMMain 类中
private string strValueA;
public string StrValueA
{
    get { return strValueA; }
    set { strValueA = value; }
}

第二步:正确设置子窗体的 Owner 属性

在创建并显示子窗体时,必须建立两个窗体的所有者关系。这允许子窗体反查其调用者(主窗体)。以下提供两种等效的实现方式:

方法一:构造函数或属性赋值(推荐用于简单场景,但需配合 Owner)

FMChild fmChild = new FMChild();
fmChild.Owner = this;
fmChild.ShowDialog();
// 此时可以直接操作 fmChild.StrValueB
fmChild.Dispose();

方法二:利用 ShowDialog(this) 隐式绑定 Owner

FMChild fmChild = new FMChild();
fmChild.ShowDialog(this); 
fmChild.Dispose();

第三步:在目标窗体中获取父窗体数据

在子窗体 FMChild 内部,若要读取主窗体的数据,需声明一个类型为 FMMain 的对象,并通过 this.Owner 进行强制类型转换:

// 在子窗体 FMChild 类中
FMMain fmMain;

第四步:回传数据至主窗体(双向通信)

如果还需要从子窗体向主窗体传值(例如用户修改了某项配置),操作逻辑完全对称:

  1. 子窗体侧:将需要回传的数据定义为公共属性(如 StrValueB)。
  2. 主窗体侧:在 ShowDialog() 返回后、销毁对象前,直接通过实例读取该属性。
// 在子窗体 FMChild 类中
private string strValueB;
public string StrValueB
{
    get { return strValueB; }
    set { strValueB = value; }
}

// 在关闭按钮事件中赋值
strValueB = txtInput.Text; 
// 回到主窗体 FMMain 的事件处理代码中
FMChild fmChild = new FMChild();
fmChild.ShowDialog(this);

if (fmChild.DialogResult == DialogResult.OK)
{
    // 关键步骤:在 Dispose 之前获取数据
    string receivedData = fmChild.StrValueB;
    
    // 处理接收到的数据...
}

fmChild.Dispose();

总结与最佳实践

通过 Owner 属性和公共属性的组合,可以优雅地解决表单间的数据共享问题。此方法避免了使用全局静态变量的弊端,保持了窗体类的封装性和复用性。对于更复杂的场景,建议考虑事件委托(Delegate/Event)模式以实现解耦。

以上就是C#实现窗体间传值的详细内容,更多关于C#窗体编程的技巧与资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。