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

Windows Forms应用中如何实现Form1到Form2的变量传递

WinForm Form1传值到Form2解决方案

方案1:重载Form2构造函数(最适合新手,逻辑简单直观)

步骤1:修改Form2代码,新增带参数的构造函数

public partial class Form2 : Form
{
    public Form2(string nomeMorto, string cognomeMorto, int etaMorto, 
                string nomePadre, string nomeMadre, string nomiAmici, 
                string eredita, string genereDefunto)
    {
        InitializeComponent();
        // 直接给Form2的控件赋值
        lblHelloName.Text = "Hello " + nomeMorto;
        // 其余控件按需求赋值即可,示例:
        // lblFullName.Text = $"{cognomeMorto} {nomeMorto}";
        // lblAge.Text = etaMorto.ToString();
    }
}

步骤2:修改Form1的按钮点击事件,传参打开Form2

把你原来的Form2 f2 = new Form2();改成传入你已经拿到的所有变量即可:

private void btnCreateTomb_Click(object sender, EventArgs e)
{
    string NomeMorto = tbDeadName.Text;
    string CognomeMorto = tbDeadSurname.Text;
    int EtaMorto = Convert.ToInt32(cbDeadAge.SelectedItem);
    string NomePadre = tbFatherName.Text;
    string NomeMadre = tbMotherName.Text;
    string NomiAmici = rbFriendsNames.Text;
    string Eredita = Convert.ToString(cbHeritage.SelectedItem);
    string GenereDefunto = Convert.ToString(cbDeadGender.SelectedItem);
    
    // 传入所有参数构造Form2
    Form2 f2 = new Form2(NomeMorto, CognomeMorto, EtaMorto, NomePadre, NomeMadre, NomiAmici, Eredita, GenereDefunto);
    f2.ShowDialog();
}

方案2:通过Form2公共属性传值(适合参数多、后续需要修改值的场景)

步骤1:修改Form2代码,定义公共属性,在加载时赋值给控件

public partial class Form2 : Form
{
    // 定义需要接收的参数对应的公共属性
    public string NomeMorto { get; set; }
    public string CognomeMorto { get; set; }
    public int EtaMorto { get; set; }
    public string NomePadre { get; set; }
    public string NomeMadre { get; set; }
    public string NomiAmici { get; set; }
    public string Eredita { get; set; }
    public string GenereDefunto { get; set; }

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        // 窗体加载时用属性值给控件赋值
        lblHelloName.Text = "Hello " + NomeMorto;
        // 其余控件赋值同理
    }
}

步骤2:修改Form1的按钮点击事件,给Form2属性赋值后打开

private void btnCreateTomb_Click(object sender, EventArgs e)
{
    string NomeMorto = tbDeadName.Text;
    string CognomeMorto = tbDeadSurname.Text;
    int EtaMorto = Convert.ToInt32(cbDeadAge.SelectedItem);
    string NomePadre = tbFatherName.Text;
    string NomeMadre = tbMotherName.Text;
    string NomiAmici = rbFriendsNames.Text;
    string Eredita = Convert.ToString(cbHeritage.SelectedItem);
    string GenereDefunto = Convert.ToString(cbDeadGender.SelectedItem);
    
    Form2 f2 = new Form2();
    // 给Form2的公共属性逐一赋值
    f2.NomeMorto = NomeMorto;
    f2.CognomeMorto = CognomeMorto;
    f2.EtaMorto = EtaMorto;
    f2.NomePadre = NomePadre;
    f2.NomeMadre = NomeMadre;
    f2.NomiAmici = NomiAmici;
    f2.Eredita = Eredita;
    f2.GenereDefunto = GenereDefunto;

    f2.ShowDialog();
}

之前尝试的方案失效原因

  • 将btnCreateTomb_Click设为public:你定义的NomeMorto等变量是方法内部的局部变量,方法执行完成后就会被内存回收,就算方法是公开的,外部也无法访问方法内部的临时变量。
  • Form2继承Form1:继承是类层面的父子关系,你当前打开的、已经输入了数据的Form1是一个实例对象,新打开的Form2是另一个独立的实例对象,继承关系无法让Form2拿到已打开的Form1实例中的实时数据。
  • Form2中实例化新的Form1:new Form1()会创建一个全新的空白Form1对象,不是你之前已经输入了文本框内容的那个Form1实例,自然拿不到你之前填写的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:54:05