开发者

C# forms callback

开发者 https://www.devze.com 2023-03-31 12:29 出处:网络
I have two forms: class Form开发者_StackOverflowA : Form { Initialise() {/*Some code */} btnAdd_Click()

I have two forms:

class Form开发者_StackOverflowA : 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.
  }
}

So there is the event this.btnOK.Click. From what I can see I have two options:

1) Pass a function to FormB from FormA (say in the ctor) and call this function inside btnOK_Click passing it the string argument.

2) Register a method with the btnOK.Click event. However I don't know where to put this registration. I want to put it in the ctor of FormA so that it is registered only once (e.g. if I put it in btnAdd_Click when the user presses btnAdd in FormA several times the method will get registered several times.

There are so many ways to go. Can you show me what a good method will be?

EDIT 1: I also don't know how to register a method in FormA with the this.btnOK.Click event that belongs to FormB. Ideally I can do this in the ctor of FormA.


Make Action Delegate (Event) in FormB that FormA can suscribe. Then btnOK_Click trigger(call) that event.

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;                
}

To pass parameter you can make a custom 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;
}


Passing the FormA instance to the FormB and calling FormA public method is the object oriented way of implementing this.

For example. FormB constructor can be like below

FormA myFormA;

public FormB(FormA formA)
{
    myFormA = formA;
}

private void CallFormAMethods()
{
    myFormA.CallPublicMethod();
}
0

精彩评论

暂无评论...
验证码 换一张
取 消