窗体间的互操作

问题:点击form2中的按钮来改变form1中Label的text值

 

一.事件委托
 
思路:
       在form1中定义一个委托,并写出一个方法(ChangeText),这个方法用来改变Label的值,然后把这个方法放到委托当中,再在form2中定义一个

form1中委托的事件,并在form2中对应的操作中触发该事件.

误区:
       如果在form2中重新创建一个form1的对象来调用ChangeText这个方法的话是无法完成的,因为新创建的这个对象与Application.Run(new

form1());已经启动起来的form1窗体已经不是同一个对象,所以即使调用了方法也不是改变原来form1中的Label的Text值,而是另外一个对象的Label的

Text值.

form1部分代码:

public   delegate   void  MyDelegate( object  sender, string  msg);
public  Form1()
{
   InitializeComponent();
   MyDelegate my 
=   new  MyDelegate(ChangeValue);
   Form2.MyEvent 
+=  my; // 订阅事件
}
// 改变Label的值
public   void  ChangeValue( object  sender, string  msg)
{
   
this .label1.Text  =  msg;
}

 

form2代码:

public   static   event  Form1.MyDelegate MyEvent;

private   void  button1_Click( object  sender, EventArgs e)
{
   
if  (MyEvent  !=   null )

      {
          MyEvent(
this , " 第一种方法 " ); // 触发事件
       }
}

 

二.遍历窗体,根据Name找到form1窗体

在form1的form1.designer.cs中把Label1的访问类型改为Public,这样才能在form2中访问

 

private   void  button2_Click( object  sender, EventArgs e)
{
   
foreach  (Form f  in  Application.OpenForms) // 遍历应用程序已经打开的窗体
      {
        
if  (f.Name  ==   " Form1 " )
          {
             Form1 f1 
=  f  as  Form1;
             f1.label1.Text 
=   " 第二种方法 " ;
          }
      }
}

 

三.
在form1中打开form2的show()方法中添加一个参数
         
                    Form2 form2=new Form2();
                    form2.Show(this);

在form2中的对应事件中:
                           
                    Form1 f1 = (Form1)this.Owner;
                    f1.label1.Text="第三种方法";


 

你可能感兴趣的:(操作)