c#窗体回调
本文关键字:回调 窗体 | 更新日期: 2023-09-27 18:07:05
我有两种形式:
class FormA : Form
{
Initialise()
{/*Some code */}
btnAdd_Click()
{
FormB formB = new FormB() //control is given to FormB
}
}
class FormB : Form
{
btnOK_Click()
{
//When this is pressed FormB closes and passes a string back to FormA.
//I also what a function in FormA to be called.
}
}
这里有事件this。btnok。click。从我所看到的,我有两个选项:
1)从FormA传递一个函数给FormB(比如在actor中),并在btnOK_Click中调用这个函数,传递字符串参数。
2)向btnOK注册一个方法。单击事件。然而,我不知道在哪里把这个注册。我想把它放在FormA的actor中,这样它就只注册一次(例如,如果我把它放在btnAdd_Click中,当用户在FormA中按btnAdd几次时,该方法将被注册几次。
有很多路要走。你能告诉我什么是好的方法吗?
编辑1:我也不知道如何在FormA中注册属于FormB的this.btnOK.Click事件的方法。理想情况下,我可以在FormA中执行此操作。
在FormB中创建FormA可以订阅的Action Delegate (Event)。然后btnOK_Click触发(调用)该事件。
class FormA:Form {
...
btnAdd_Click(){
FormB formB = new FormB();
formB.CallBack += this.OnCallBack;
}
private void OnCallBack(object sender, EventArgs args){
// put your process here
}
}
class FormB:Form {
...
btnOK_Click(){
EventHandler<EventArgs> handler = this.CallBack;
// if not null, call handler
if (handler != null)
{
// you can make custom EventArgs, pass parameter with it
handler(this, new EventArgs());
}
}
Event EventHandler<EventArgs> CallBack;
}
要传递参数,你可以自定义EventArgs。
class CustomEventArgs : EventArgs {
public string Param1 {get; set;}
public int Param2 {get; set;}
public bool Param3 {get; set;}
...
}
class FormA:Form {
...
private void OnCallBack(object sender, CustomEventArgs args){
// put your process here
...
}
}
class FormB:Form {
...
btnOK_Click(){
EventHandler<CustomEventArgs> handler = this.CallBack;
if (handler != null)
{
// set parameter
CustomEventArgs eventArgs = new CustomEventArgs();
eventArgs.Param1 = "param1";
eventArgs.Param2 = 1000;
eventArgs.Param3 = true;
// call handler and pass value
handler(this, eventArgs);
}
}
Event EventHandler<CustomEventArgs> CallBack;
}
将FormA实例传递给FormB并调用FormA公共方法是实现此功能的面向对象方法。
例如。FormB构造函数可以像
下面这样FormA myFormA;
public FormB(FormA formA)
{
myFormA = formA;
}
private void CallFormAMethods()
{
myFormA.CallPublicMethod();
}