窗体之间数据传递#
来源:
D:\study\C#1\WinForm\stu0812\stu0813\打开新窗口、stu0804练习
多窗体程序的核心问题:A 窗口打开 B 窗口,怎么把数据带过去、带回来?
方式一:构造函数传参(带数据过去)#
// Form2 定义带参数的构造函数
public partial class Form2 : Form
{
public Form2(string str)
{
InitializeComponent();
label1.Text = str; // 用传进来的数据初始化界面
}
}
// Form1 中打开并传参
Form2 form2 = new Form2("test");
form2.ShowDialog();
方式二:公共字段/属性(带数据回来)#
// Form2 中定义公共字段
public string str = "一号窗口数据";
// Form1 中读取子窗口的数据
Form2 form2 = new Form2(str);
form2.ShowDialog();
textBox1.Text = form2.str; // 读取 Form2 修改后的数据
💡 在
ShowDialog()返回后读取子窗体的公共字段,就可以拿到「带回来的数据」。
方式三:保存父窗体引用(互相切换)#
// 登录窗口:保存自己,把引用传给注册窗口
public partial class Login : Form
{
Login L;
public Login()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
L = this;
new Reg(L).Show(); // 传递登录窗体引用
L.Hide();
}
}
// 注册窗口:接收引用,注册成功后返回
public partial class Reg : Form
{
Login L;
public Reg(Login login)
{
InitializeComponent();
L = login; // 保存引用
}
private void button2_Click(object sender, EventArgs e)
{
L.Show(); // 返回登录窗口
this.Close();
}
}
方式四:静态变量(全局共享)#
// 全局静态类
public static class Session
{
public static string UserName; // 当前登录用户名
public static string UserRole; // 身份(学生/管理员)
}
// 登录成功后写入
Session.UserName = textBox1.Text;
Session.UserRole = "student";
// 任何窗口都可以读取
label1.Text = "欢迎," + Session.UserName;
💡 静态变量全程序共享,适合「登录用户信息」这类全局数据。注意:别滥用,耦合度高。
对比总结#
| 方式 | 方向 | 适用场景 |
|---|---|---|
| 构造函数传参 | 父 → 子 | 打开窗口时初始化 |
| 公共字段/属性 | 子 → 父 | 关闭后取回结果 |
| 父窗体引用 | 双向 | 窗口互相切换 |
| 静态变量 | 全局 | 登录信息等全局数据 |
完整多窗体示例见
08-面向对象与设计模式/03-登录注册系统实战和09-项目实战/01-图书管理系统。
相关笔记#
- 打开新窗口 Show 与 ShowDialog — 打开新窗口
- 单例模式 — 单例模式
- WinForms 图书管理系统 — 多窗体项目实战