背景:
在BHHT_Bill界面中点击某个按钮时,弹出BHZX界面,并在BHZX界面中输入值,然后将BHZX界面中输入的值传递回BHHT_Bill界面。
在BHHT_Bill界面中:
属性: public string vsBZ = string.Empty;//用来接收弹出界面修改的值 某函数AA中的代码: BHGL.BHHT.BHZX bhzx = new BHGL.BHHT.BHZX(); bhzx.ShowDialog(); MessageBox.Show("某某操作成功!");
在BHZX界面中:
某函数BB中的代码: BHHT_Bill bill = new BHHT_Bill(); bill.vsBZ = this.txtBZ.Text;//备注 this.Close();
在代码跟踪的时候,打开BHZX界面并输入值后,bill.vsBZ中是有值的,但当执行到this.Close()后,返回到BHHT_Bill界面中时,函数不会执行MessageBox.Show("某某操作成功!"),而会跳转至声明公共变量属性的地方,开始执行,也就是会再次执行public string vsBZ = string.Empty,执行完变量属性后,才会到达MessageBox.Show("某某操作成功!")的语句,从而BHZX界面传值回BHHT_Bill界面失败!
那么传值失败的原因是什么呢?
原因在于:BHHT_Bill bill = new BHHT_Bill();这句话,因为这是新建了一个BHHT_Bill的实例,从而需要获取这个类的属性,也就是需要执行BHHT_Bill类中变量属性部分的代码。
那么如何实现传值呢?
在BHHT_Bill界面中:
public string vsBZ = string.Empty;//用来接收弹出界面修改的值 某函数AA中的代码: BHGL.BHHT.BHZX bhzx = new BHGL.BHHT.BHZX(); bhzx.bill = this;//传递窗体自身,而不是新的窗体 bhzx.ShowDialog();
在BHZX界面中:
变量属性: public BHHT_Bill bill; 某函数BB中的代码: bill.vsBZ = this.txtBZ.Text;//备注 this.Close();
小注:
通过传递窗体自身,而不是新的窗体,可以实现ShowDialog()界面之间的传值(循环调用)。
最佳实践:
由this(即循环调用)来实现这种功能,其实可以通过一种更为简单、易懂的方式来实现。
代码如下:
在BHHT_Bill界面中:
BHGL.BHHT.BHZX bhzx = new BHGL.BHHT.BHZX(); bhzx.ShowDialog(); string vsTxtBZ = bhzx.psBZ; bhzx = null;//注意清空
在BHZX界面中:
变量属性: public string psBZ = string.Empty; 某函数中的代码: psBZ = this.txtBZ.Text;
时间: 2024-11-01 15:00:58