问题:点击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;
}
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,"第一种方法");//触发事件
}
}
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 = "第二种方法";
}
}
}
{
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="第三种方法";