web-dev-qa-db-fra.com

Appel d'une méthode dans la page parent à partir du contrôle de l'utilisateur

J'ai un contrôle utilisateur enregistré dans une page aspx En cas de clic d'un bouton dans le contrôle utilisateur, comment appeler une méthode figurant dans la page parent codeBear?

Merci.

37
Jeremy Thomson

Voici l’exemple classique d’utilisation d’événements suggéré par Freddy Rios (C # d’un projet d’application Web). Cela suppose que vous souhaitiez utiliser un délégué existant plutôt que de créer le vôtre et que vous ne transmettiez rien de spécifique à la page parent par arguments d'argument.

Dans le code-behind du contrôle utilisateur (à adapter si nécessaire si vous n'utilisez pas code-behind ou 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
}

Dans la page même, vous vous abonnez à l'événement avec quelque chose comme ceci:

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
    }

}
110
Stephen M. Redd

Transformez la page en tant que page spécifique de votre projet:

((MyPageName)this.Page).CustomMethod()
14
Rex M

Je vous suggère de ne pas appeler directement la méthode page, vous lieriez votre contrôle à la page en question. 

Exposez plutôt un événement et inscrivez-vous à la page. Cela fonctionne pour n'importe quel nombre de pages, peut être plus facilement utilisé lorsque le contrôle est plusieurs fois sur une seule page (peut-être même sur une liste) et est plus en ligne avec la conception asp.control.

10
eglasius

Suivre la bonne et appropriée approche, 

Utilisez le concept événement et délégué pour déléguer avec la même signature que votre méthode dans la page parent, puis affectez-lui le méthad parent dans l'événement de chargement de page parent, puis appelez ce délégué par le biais d'un événement dans le contrôle de l'utilisateur.

un exemple de code et un lien sont donnés ci-dessous. 

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

Lire plus de détails sur son fonctionnement (Référence): -

Appel d'une méthode de page parent à partir du contrôle de l'utilisateur

4
Rohit

Scott Allen a un article utile sur la propagation d'événements d'un contrôle utilisateur à la page parent, qui développe la réponse fournie par Stephen M. Redd :

4
MagicAndi

Je veux faire ce scénario:

  • Appelez la méthode LoadEditCategory (méthode parent).
  • La méthode parente (LoadEditCategory) nécessite un argument int (CategoryID).
  • Le contrôle utilisateur enfant est RightControlPanel qui se trouve dans le même dossier de page parent.

Contrôle utilisateur enfant  

1- Ajouter une Action (_LoadEditCategory)

public Action<int> _LoadEditCategory = null;

<int> est l'argument int (CategoryID).

2- Utilisez cet événement Action in dans le bouton (btnSave button name) comme ceci:

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

Page parent ou contrôle utilisateur parent

3- Ajouter la méthode parente

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

4- Ajouter ce code lors du chargement du contrôle utilisateur enfant (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);

   ...
 }
2
Ali Soltani
 //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 
0
Güven Acar

J'adore la réponse de Stephen M. Redd et je devais la convertir en VB. Partage ici. Les modifications suggérées sont les bienvenues.

Dans le code-behind du contrôle utilisateur:

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

Dans la page parent, abonnez-vous à l'événement. Ainsi, lorsque l'événement sera déclenché, votre code sera exécuté ici.

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

    ''' <summary>
    ''' code to run when user clicks 'lbtnApplyChanges' on the user control
    ''' </summary>

    Private Sub MyUserControl_UserControlButtonClicked()

        'this code will now fire when lbtnApplyChanges_Click executes

    End Sub

End Class
0
Taylor Brown