WinForm跨窗体访问类变量异常:赋值后变量为空求助
这个问题的核心原因很明确:Form2拿到的不是Form1里已经完成赋值的Property实例,所以username和email是空值,而password因为自带默认值,所以能正常显示。下面一步步帮你解决:
1. 修正Form1打开Form2的传参逻辑
你在Form2里写了带参数的构造函数来接收Form1的Property实例,但如果Form1打开Form2时,没有传递自己那个已经赋值的pro,而是新建了空实例或者直接用无参构造,就会导致空值问题。
比如Form1里打开Form2的代码应该写成这样(假设你在按钮点击事件或CreateUserInform方法末尾打开Form2):
// 关键是传递this.pro,也就是你已经赋值完成的那个实例 Form2 form2 = new Form2(this.pro); form2.Show();
如果之前你写的是new Form2()(无参调用)或者new Form2(new Property()),那Form2拿到的就是全新的空实例,自然看不到username和email的赋值结果。
2. 确保Form2的构造函数被正确使用
如果Form2自动生成了无参构造函数(比如VS拖拽控件时默认生成的),而你不小心调用了它,那Form2里的pro会是自己初始化的空实例。你可以把无参构造函数设为私有,强制只能使用带参数的构造:
// Form2中的代码调整 private Property pro; // 这里不用提前new,在构造函数赋值更清晰 // 把无参构造设为私有,避免误调用 private Form2() { InitializeComponent(); } public Form2(Property form1Property) { InitializeComponent(); pro = form1Property; }
3. 验证Form1的赋值逻辑确实执行
还要确认Form1中的CreateUserInform方法已经被正确调用——如果这个方法没执行,那pro.username和pro.email本来就是空的,传递给Form2当然也看不到值。你可以在方法末尾加个弹窗验证:
private void CreateUserInform() { // 你的原有代码... pro.username = userid; pro.email = pro.username + mailservice; // 验证赋值是否成功 MessageBox.Show($"用户名:{pro.username},邮箱:{pro.email}"); wb2func_create_mail(); }
可选优化:规范Property类的写法
C#里属性建议用PascalCase命名(首字母大写),还可以用自动实现属性简化代码,不用手动维护私有字段:
class Property { public string Username { get; set; } public string Email { get; set; } public string Password { get; set; } = "88306540"; }
调整后记得把Form1和Form2里的属性调用改成pro.Username和pro.Email哦。
内容的提问来源于stack exchange,提问作者user11824860

