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中执行此操作。

c#窗体回调

在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();
}