C# WinForm 点击Form2按钮修改Form1文本无生效问题的原因及解决方法
问题产生原因
- 核心逻辑错位:Form2的按钮点击事件中通过
new Form1()创建了一个全新的Form1内存实例,你给这个新实例的属性赋值时,这个对象根本没有加载到界面上,和你实际打开、正在交互的那个Form1窗口完全是两个独立对象,自然不会产生任何界面上的变化。 - 代码存在潜在致命bug:Form1中定义的
textCh属性的get访问器写为return this.textCh;,属于无限自递归逻辑,只要代码触发这个属性的读取操作,就会直接触发栈溢出导致程序崩溃,哪怕解决了实例传递的问题,这个bug也会让功能跑不起来。
修正实现步骤
- 打通两个窗体的实例引用传递:不能让Form2自行创建Form1对象,要由已经打开的Form1在弹出Form2时,把自身的引用传递给Form2,让Form2能直接操作实际显示的那个Form1对象。
- 修复Form1中属性的递归bug,把get访问器的返回值从自引用改成实际的标签文本内容。
修正后代码示例
Form1 修正代码
public partial class Form1 : Form { public string textCh { get { // 原逻辑为自递归,修正为返回标签的实际文本 return label1.Text; } set { label1.Text = value; } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); // 将当前Form1的自身引用传递给Form2 f2.CurrentForm1Instance = this; f2.ShowDialog(); } }
Form2 修正代码
public partial class Form2 : Form { // 新增公共属性,用来接收Form1传递过来的实际窗口实例 public Form1 CurrentForm1Instance { get; set; } public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 判空避免空引用异常 if (CurrentForm1Instance != null) { // 直接修改实际打开的Form1的属性,触发表单文本更新 CurrentForm1Instance.textCh = "Text has been changed"; } } }
运行效果参考

内容的提问来源于stack exchange,提问作者Umar
相关产品推荐
相关产品推荐

