D'abord, vous devez définir un événement sur votre UserControl
qui permet à Page
de contenir le UserControl
pour enregistrer et gérer l'événement. Par exemple:
public partial class MyUserControl : System.Web.UI.UserControl
{
// Event for page to handle
public event EventHandler DivClicked;
protected virtual void OnDivClicked(EventArgs e)
{
if (DivClicked != null)
DivClicked(this, e);
}
protected void Page_Load(object sender, EventArgs e)
{
// Page Load Code goes here
}
}
Note: La partie suivante serait plus facile si vous utilisez un contrôle qui a soutenu postbacks. Cependant, puisque vous voulez utiliser un div
, je vais vous expliquer comment forcer un div
à faire des postbacks. Je voudrais remercier Mathew Nolton pour cette solution.
Ainsi, dans la méthode Page_Load
du UserControl
vous avez besoin d'ajouter un attribut onClick
appeler la fonction javascript __doPostback()
de l'ASP.NET qui appelle le serveur pour votre div
. C'est ce qui donne à div
la possibilité de publier sur le serveur. De plus, pour déterminer quel contrôle a causé la publication, j'ai fourni le ClientId
de div
avec quelques symboles pour différencier ma publication des autres contrôles. Souvenez-vous que lorsque vous définissez le div
sur le fichier .ascx, un id
doit être affecté et que vous définissez runat="server"
pour qu'il soit accessible côté serveur.
Ok, maintenant, en ajoutant un attribut onclick
au div
, il sera publié sur le serveur à chaque fois qu'il est cliqué. Ainsi, quand une publication provoque l'appel de Page_Load
, je vérifie pour voir si c'est le div
qui a causé la publication. Si c'est le cas, je lève l'événement DivClicked
de UserControl
à gérer par la Page.
public partial class MyUserControl : System.Web.UI.UserControl
{
// Event Definition and Raising methods
...
protected void Page_Load(object sender, EventArgs e)
{
// @@@@ will denote this is an argument I provided.
string arg = "@@@@" + divClickableDiv.ClientID;
// Add postback method to onClick
divClickableDiv.Attributes.Add("onClick",
Page.ClientScript.GetPostBackEventReference(divClickableDiv, arg));
if (IsPostBack)
{
// Get event arguments for post back.
string eventArg = Request["__EVENTARGUMENT"];
// Determine if postback is a custom postback added by me.
if (!string.IsNullOrEmpty(eventArg) && eventArg.StartsWith("@@@@"))
{
// Raise the click event for this UserControl if the div
// caused the post back.
if (eventArg == arg)
OnDivClicked(EventArgs.Empty);
}
}
}
}
Cela devrait le faire pour le UserControl
, maintenant tout ce que vous avez à faire est de vous inscrire à l'événement DivClicked
sur la page.
Malheureusement, vous ne recevrez pas de support de conception pour vous inscrire à l'événement. Cependant, vous pouvez toujours ajouter le code à la page .aspx. Sur la page où vous déposez votre UserControl
ajoutez un attribut au UserControl
appelé OnXXX
où XXX est l'événement de nom. Donc, pour mon exemple ci-dessus, je définirais mon UserControl
sur la page ressemblera à ceci:
<uc1:MyUserControl ID="MyUserControl1" runat="server" OnDivClicked="MyUserControl1_DivClicked" />
Maintenant, vous ajoutez votre code de gestionnaire de fichier codebehind du Page
(en supposant que votre utilisant codebehind) comme ceci:
public partial class MyPage : System.Web.UI.Page
{
// Called whenever div in MyUserControl is clicked.
protected void WebUserControl1_DivClicked(object sender, EventArgs e)
{
// Handle Div click event here.
}
}
Cela devrait le faire. J'espère que ce post vous aide.
Wow, Quelle belle explication! Trucs très intéressant! Merci beaucoup! – Martijn
Pas de problème. Content de pouvoir aider – rocka