由Form1启动的Form2能否修改Form1中TextBox的文本?
问题解答:Form2修改Form1中TextBox文本的正确姿势
哎,这个问题我之前刚踩过一模一样的坑!你原来的代码没生效,核心原因是你创建了一个全新的Form1实例,而不是修改当前正在显示的那个Form1。
为什么原来的代码不行?
你写的Form1 fm1 = new Form1();是在内存里新建了一个Form1对象,这个对象和你之前启动的、正在屏幕上显示的Form1完全是两个独立的东西。你修改这个新实例的TextBox文本,自然不会影响到原来的窗口。
正确的做法:把当前Form1的实例传给Form2
要让Form2能操作当前的Form1,你需要把Form1的实例传递给Form2,具体分三步:
修改Form2的构造函数,接收Form1实例
在Form2的代码里,添加一个私有字段存储Form1实例,然后修改构造函数:private Form1 _currentForm1; public Form2(Form1 form1Instance) { InitializeComponent(); _currentForm1 = form1Instance; }在Form1中启动Form2时,传入自身实例
把你原来的启动代码改成这样:Form2 fm2 = new Form2(this); // this就是当前的Form1实例 fm2.Show();在Form2中修改Form1的TextBox
这时候你就可以通过存储的_currentForm1实例来修改文本了,但注意要先把Form1中textBox_A的访问修饰符改成public(在设计器里选中文本框,属性窗口找“Modifiers”改成Public)。然后在Form2里写:_currentForm1.textBox_A.Text = "123";
更规范的写法:用属性封装控件(推荐)
直接修改控件的访问修饰符虽然简单,但不符合面向对象的封装原则。更好的方式是在Form1里写一个公共属性,用来控制TextBox的文本:
// 在Form1的代码里 public string TextBoxContent { get { return textBox_A.Text; } set { textBox_A.Text = value; } }
然后在Form2里调用这个属性:
_currentForm1.TextBoxContent = "123";
这样就算以后Form1里的控件名字改了,Form2的代码也不用跟着改,更安全。
内容的提问来源于stack exchange,提问作者Mak
相关产品推荐
相关产品推荐

