看的有点糊涂啊,首先A和C是同一个application吗?
我默认是一个application作为前提1.classB 建立一个事件eb,并且B做一个全局的实例,这个实例在formA中挂接eb事件,当这个eb事件触发的时候,就refresh frmA。
2.classB中建立一个public 方法pf,这个方法被调用就触发eb事件
3.frmC中调用pf方法over
我默认是一个application作为前提1.classB 建立一个事件eb,并且B做一个全局的实例,这个实例在formA中挂接eb事件,当这个eb事件触发的时候,就refresh frmA。
2.classB中建立一个public 方法pf,这个方法被调用就触发eb事件
3.frmC中调用pf方法over
public class ClassB
{
public delegate void Form2Handle(string s);
public event Form2Handle changed; public void refresh()
{
changed("");
}
}FormA中代码是:
private void Refresh(string s)
{
this.textBox1.Text = "aaa";
}
private void FormA_Load(object sender, EventArgs e)
{
ClassB classb = new ClassB();
classb.changed += new ClassB.Form2Handle(Refresh);
}
FormC中执行ClassB中调用委托的代码是:
private void buttonRefresh_Click(object sender, EventArgs e)
{
ClassB classb = new ClassB();
classb.refresh();
}点击buttonRefresh_Click,执行的结果是:ClassB中 错误" 未将对象引用设置到对象的实例。"changed 是null;
因为两个窗体中都定义了ClassB,这肯定会报错的;那该如何写呢。
直接把Event和Delegate定义在FormC里,当FormC打开时,订阅Event。例如:
private void FormA_Load(object sender, EventArgs e)
{
FormC formC = new FormC();
formC.changed += new formC.Form2Handle(Refresh);
formC.ShowDialog();// 或者其他函数显示
}如果ClassB有其他用处,需要定义ClassB到FormA的类成员。初始化FormC的时候吧ClassB的实例传到FormC中。然后FormC中不用new ClassB新的实例了,直接用传入的实例。
有时间,可以看下观察者模式。
1.在FormA中定义一个全局静态变量 static theFormA
2.在FormA 构造函数中初始化 theFormA=this
3.在FormC中调用类ClassB
4 在 ClassB中直接用 FormA.theFormA.refresh();
ok
FormC→ClassB→FormA→Refresh()FormC (Form formA)
{
ClassB b=new ClassB(fromA)
}ClassB(Form formA)
{
formA.Refresh
}当然还可以将它FormA做成属性放到FormC里。