Chiamare un metodo nella pagina padre dal controllo utente

Ho un controllo utente registrato in una pagina di aspx In caso di clic di un pulsante nel controllo utente, come faccio a chiamare un metodo che si trova nel codebehind della pagina padre?

Grazie.

Ecco l’esempio classico che utilizza gli eventi come suggerito da Freddy Rios (C # da un progetto di applicazione web). Ciò presuppone che si voglia utilizzare un delegato esistente piuttosto che crearne uno proprio e che non si passi nulla di specifico alla pagina padre per argomenti di evento.

Nel code-behind del controllo dell’utente (adattarsi se necessario se non si utilizza code-behind o C #):

 public partial class MyUserControl : System.Web.UI.UserControl { public event EventHandler UserControlButtonClicked; private void OnUserControlButtonClick() { if (UserControlButtonClicked != null) { UserControlButtonClicked(this, EventArgs.Empty); } } protected void TheButton_Click(object sender, EventArgs e) { // .... do stuff then fire off the event OnUserControlButtonClick(); } // .... other code for the user control beyond this point } 

Nella pagina stessa ti iscrivi all’evento con qualcosa di simile a questo:

 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // hook up event handler for exposed user control event MyUserControl.UserControlButtonClicked += new EventHandler(MyUserControl_UserControlButtonClicked); } private void MyUserControl_UserControlButtonClicked(object sender, EventArgs e) { // ... do something when event is fired } } 

Trasmetti la pagina come pagina specifica nel tuo progetto:

 ((MyPageName)this.Page).CustomMethod() 

Ti suggerisco di non chiamare direttamente il metodo della pagina, poiché legherei il tuo controllo alla pagina specifica.

Esponi invece un evento e abbonati alla pagina. Funziona per qualsiasi numero di pagine, può essere più facilmente utilizzato quando il controllo è più volte su una singola pagina (forse anche su una lista) ed è più in linea con il design di asp.control.

Scott Allen ha un utile articolo sul bubbling degli eventi da un controllo utente alla pagina padre, che elabora la risposta fornita da Stephen M. Redd :

  • Evento che bolle dai controlli utente Web in ASP.NET (C #)

Seguire un approccio corretto e appropriato,

Utilizzare l’evento e debind il concetto rendere delegato come la stessa firma del metodo nella pagina padre e quindi assegnare il metad padre ad esso nell’evento di caricamento della pagina padre, quindi chiamare questo delegato attraverso l’evento nel controllo utente.

codice di esempio e il collegamento è indicato di seguito.

 //Parent Page aspx.cs part public partial class getproductdetails : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ucPrompt.checkIfExist += new uc_prompt.customHandler(MyParentMethod); } bool MyParentMethod(object sender) { //Do Work } } //User control parts public partial class uc_prompt : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { } public delegate bool customHandler(object sender); public event customHandler checkIfExist; protected void btnYes_Click(object sender, EventArgs e) { checkIfExist(sender); } } 

Leggi maggiori dettagli su come funziona (Riferimento): –

Chiamare un metodo di pagina padre dal controllo utente

Voglio fare questo scenario:

  • Chiama il metodo LoadEditCategory (metodo genitore).
  • Il metodo padre ( LoadEditCategory ) richiede un argomento int ( CategoryID ).
  • Il controllo utente RightControlPanel è RightControlPanel che si trova nella stessa cartella della pagina principale.

Controllo utente bambino

1- Aggiungi Action ( _LoadEditCategory )

public Action _LoadEditCategory = null;

è argomento int ( CategoryID ).

2- Utilizzare questa Action nell’evento pulsante (nome pulsante btnSave ) in questo modo:

 void btnSave_Click(object sender, EventArgs e) { //123 is test integer for CategoryID _LoadEditCategory(123); } 

Pagina padre o controllo utente genitore

3- Aggiungi il metodo genitore

  private void LoadEditCategory(int CategoryID) { // CategoryID is 123 in my example //Do some things with CategoryID } 

4- Aggiungere questo codice quando si carica il controllo utente figlio ( RightControlPanel )

 //Load child user control RightControlPanel si = this.LoadControl(this.ControlPath + "RightControlPanel.ascx") as RightControlPanel; if (si != null) { ... //For call parent method in child user control si._LoadEditCategory = c => LoadEditCategory(c); ... } 
  //c# //In parent page public void test(string S) { Label1.Text = S; } //In user control protected void Button1_Click(object sender, System.EventArgs e) { //Calling "test method" of parent page from user control ((object)this.Page).test("Hello!!"); } 'VB.Net 'In parent page Sub test(ByVal S As String) Label1.Text = S End Sub 'In user control Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click 'Calling "test method" of parent page from user control DirectCast(Me.Page, Object).test("Hello!!") End Sub 

Amo la risposta di Stephen M. Redd e ho dovuto convertirla in VB. Condividendolo qui. Le modifiche consigliate sono benvenute.

Nel code-behind del controllo dell’utente:

 Public Class MyUserControl Inherits System.Web.UI.UserControl 'expose the event publicly Public Event UserControlButtonClicked As EventHandler 'a method to raise the publicly exposed event Private Sub OnUserControlButtonClick() RaiseEvent UserControlButtonClicked(Me, EventArgs.Empty) End Sub Protected Sub lbtnApplyChanges_Click(sender As Object, e As EventArgs) Handles lbtnApplyChanges.Click 'add code to run here, then extend this code by firing off this event 'so it will trigger the public event handler from the parent page, 'and the parent page can hanlde it OnUserControlButtonClick() End Sub End Class 

Nella pagina principale iscriversi all’evento, quindi quando l’evento viene generato, il codice verrà eseguito qui.

 Public Class SalesRecord Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'hook up event handler for exposed user control event to handle this AddHandler MyUserControl.UserControlButtonClicked, AddressOf MyUserControl_UserControlButtonClicked End Sub '''  ''' code to run when user clicks 'lbtnApplyChanges' on the user control '''  Private Sub MyUserControl_UserControlButtonClicked() 'this code will now fire when lbtnApplyChanges_Click executes End Sub End Class 

Puoi usare Session. Dì quando fai clic su un pulsante nel controllo utente e quando vuoi chiamare il metodo pagina padre poi nel gestore eventi del pulsante fai clic su imposta valore come

 Session["CallParent"]="someValue"; 

come pulsante invierà indietro la pagina. Aggiungilo all’evento Page_Load della pagina principale

 protected void Page_Load(object sender,EventArgs e) { if(Session["CallParent"]!=null) { // here call the Parent Page method Method1(); // now make the session value null Session["CallParent"]=null; } } 

È molto più efficiente