几句废话一下(#^.^#):
很少写VS平台下应用开发的文章,主要平时用的少,还是以嵌入式开发为主,这也算我的第一篇这样类型文章,O(∩_∩)O哈哈~。开发中遇到问题解决了,就应该记录下来和大佬们分享,而且关于“C# winform中的不同form之间通信与调用”的问题是开发中比较常见的,想必很多人会经常遇到。。
————————这是一条进入正题的严肃分割线(#^.^#)—————————
一.实验内容
文章关键内容就是两个form间的数据通信和调用。
其中form1下点击button1按钮启动form6,同时form1下将变量数据传进form6中使用,并调用form6里的函数。
二.代码实现
1.form1下代码
下面是定义一Form6的f6对象,和书写两form的数据传递函数
private Form6 f6 =new Form6();//定义一f6对象
string data = "Isform1";
/******************
函数名:f1_to_f6()
功能:f1下传递数据给f6,并调用f6的函数
*******************/
private f1_to_f6(void)
{
f6.yValues = data; //传递的数据给f6下的yValues
f6.Test(); //调用f6下的Test函数
}
——————————下面部分画重点———————————————
启动Form6窗体函数(f1下button1点击函数):该部分是这篇文章问题的难点。想必很多人在按钮点击函数里就直接采用:f6.Show()启动form6窗体,第一次启动确实可以使用,但是form6窗体关闭后,再点击按钮启动,程序就会报错了:“无法访问已释放的对象”。
为什么呢?因为点击button1打开的form6窗体就指向了程序里f6这个对象,当form6窗体关闭后,在这个对象就被释放,当再次执行f6.Show()时,程序找不到这个f6对象,就报错了。
应该怎么解决?既然点击按钮找不到释放的f6,那可不可以按钮里再新建一个form6的窗体对象呢?比如代码改写成:Form6 RH = new Form6(); RH.Show();
试了下确实可以,但是,f1_to_f6()函数里的f1到f6的消息无法传递了,因为这个f6对象不同等这个新建的RH 对象,而开启的Form6 窗体却是指向RH这个对象,所以Form6 窗体里看不到f1传递过来的值。
那么,可以在代码里再加句: f6 = RH;使得f6和RH等同,这样Form6 窗体也可以指向f6这个对象。同时点击按钮时,f6也能被赋值以新的对象RH,而不会报错“找不到释放对象”
果不其然,尝试了下,这个方法是可以的,符合上述假设。按钮点击函数代码如下
private void button1_Click(object sender, EventArgs e)
{
Form6 RH = new Form6(); //新建一Form6对象
f6 = RH;//f6和RH等同,这样f1_to_f6()函数才能起作用
RH.Show();//打开Form6窗体,指向RH和f6
}
2.form6下代码
主要定义yValues变量和Test()函数
public string yValues = "";
public void Test()
{
MessageBox.Show("success!the yValues is :" + yValues );
}
这样form6打开后,form1里调用f1_to_f6()函数,就能把值传递给form6窗体了,form6窗体会弹出“success!the yValues is :Isform1”对话框。