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.
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
}
}
Transformez la page en tant que page spécifique de votre projet:
((MyPageName)this.Page).CustomMethod()
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.
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
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 :
Je veux faire ce scénario:
LoadEditCategory
(méthode parent).LoadEditCategory
) nécessite un argument int
(CategoryID
).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);
...
}
//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
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