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
相关产品推荐
相关产品推荐

