2009-09-24 2 views

Répondre

9

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.

+1

Wow, Quelle belle explication! Trucs très intéressant! Merci beaucoup! – Martijn

+0

Pas de problème. Content de pouvoir aider – rocka

1
<div runat="server" onserverclick="MyClickHandler"> 
... 
</div> 
+1

Est-ce vraiment vrai? Conflits avec http://stackoverflow.com/questions/7309718/onserverclick-not-working –

+0

Ne fonctionnait pas pour moi. –

0

La réponse de Rocka est proche, mais pas tout à fait raison (comme cela n'a pas fonctionné pour moi, et j'ai compris pourquoi).

Les bits de code pour le contrôle usager de Rocka sont bien: // Événement pour la page à gérer événement public EventHandler DivClicked;

protected virtual void OnDivClicked(EventArgs e) 
{ 
    if (DivClicked != null) 
     DivClicked(this, e); 
} 

Lors de la consommation UserControl, ce qui suit ne fonctionnera pas:

le OnDivClicked n'est pas le gestionnaire d'événements, il est une fonction, vous ne pouvez pas l'affecter. encore moins, lorsque la fonction se déclenche, la variable de gestionnaire d'événements est null, donc elle ne va pas exécuter quoi que ce soit.

La bonne façon aurait été:

Cela aurait affecté MyUserControl1_DivClicked être le gestionnaire pour DivClicked. Malheureusement, cela ne fonctionnait pas réellement, donc dans le code-behind sur Page_Load de la page, mettez cette ligne à la place:

this.MyUserControl1.OnClick + = new EventHandler (MyUserControl1); De plus, en note, si vous définissez div comme runat = "server", OnClick est exposé comme un événement auquel vous auriez pu vous accrocher. Tout ce dont vous auriez besoin est une propriété passthru pour EventHandler dans le contrôle de l'utilisateur à la div.

0

Dans votre ItemTemplate UTILISATION asp: Panel INSTEAD OF balise div (un panneau rend comme div) et définissez la propriété de visibilité comme ceci:

<asp:Panel ID="ImgFeatured" runat="server" CssClass="featured-ribbon"> </asp:Panel> 

code derrière

Panel ImgFeatured = (Panel)e.Row.FindControl("ImgFeatured"); 
ImgFeatured.Visible = true; 
Questions connexes