C # формирует обратный вызов - PullRequest
0 голосов
/ 30 августа 2011

У меня есть две формы:

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) Передать функцию в FormB из FormA (скажем, в ctor) и вызвать эту функцию внутри btnOK_Click, передав ей строковый аргумент.

2) Зарегистрируйте метод с помощью события btnOK.Click.Однако я не знаю, где поставить эту регистрацию.Я хочу поместить его в ctor формы FormA, чтобы он регистрировался только один раз (например, если я добавлю его в btnAdd_Click, когда пользователь нажимает btnAdd в FormA несколько раз, метод будет зарегистрирован несколько раз.

Естьтак много путей. Можете ли вы показать мне, каким будет хороший метод?

РЕДАКТИРОВАТЬ 1: Я также не знаю, как зарегистрировать метод в FormA с помощью this.btnOK.Click событие, которое принадлежит FormB. В идеале я могу сделать это в ctor FormA.

Ответы [ 2 ]

2 голосов
/ 26 июня 2012

Создать делегат действия (событие) в FormB, который FormA может подписать. Затем 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;
}
0 голосов
/ 30 августа 2011

Передача экземпляра FormA в FormB и вызов открытого метода FormA - это объектно-ориентированный способ реализации этого.

Например. Конструктор FormB может быть как ниже

FormA myFormA;

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

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