跳转至

窗体之间数据传递#

来源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-图书管理系统


相关笔记#