.net - C # formularer tilbagekald

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har to former:


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


Så der er begivenheden this.btnOK.Click. Fra hvad jeg kan se, har jeg to muligheder:


1) Videregive en funktion til FormB fra FormA (siger i ctor) og kalder denne funktion inde i btnOK\_Click passerer det streng argumentet.


2) Registrer en metode med btnOK.Click-arrangementet. Men jeg ved ikke, hvor jeg skal sætte denne registrering. Jeg vil gerne sætte den i formularen for FormA, så den kun er registreret en gang (fx hvis jeg sætter den i btnAdd\_Click, når brugeren trykker btnAdd i FormA flere gange, vil metoden få registreret flere gange.


Der er så mange måder at gå på. Kan du vise mig, hvad en god metode vil være?


EDIT 1:
Jeg ved heller ikke, hvordan man registrerer en metode i FormA med denne.btnOK.Click-hændelsen, der tilhører FormB. Ideelt set kan jeg gøre dette i formularen til FormA.

Bedste reference


Gør Action Delegate (Event) i FormB, som FormA kan suspendere. Så btnOK\_Click trigger (call) den begivenhed.


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


For at passere parameter kan du lave en brugerdefineret 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;
}

Andre referencer 1


Passering af FormA-forekomsten til FormB og Calling FormA offentlig metode er objektorienteret måde at implementere dette på.


For eksempel. FormB konstruktør kan være som nedenfor


FormA myFormA;

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

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