2009-09-24 7 views

risposta

9

Innanzitutto, è necessario definire un evento sul numero UserControl che consente di registrare e gestire l'evento con . Per esempio:

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 
    } 
} 

Nota: La parte successiva sarebbe stato più facile se si stesse utilizzando un controllo che ha sostenuto postback. Tuttavia, dal momento che si desidera utilizzare un div, spiegherò come forzare uno div a fare i postback. Vorrei ringraziare Mathew Nolton per questa soluzione.

Così, nel metodo di Page_Load del UserControl è necessario aggiungere un attributo onClick chiamare __doPostback() funzione javascript del ASP.NET che chiama il server di back per il vostro div. Questo è ciò che dà a div la possibilità di postback sul server. Inoltre, per determinare quale controllo ha causato il postback, ho fornito lo ClientIddiv insieme ad alcuni simboli per differenziare il mio postback da altri controlli. Ricordare che quando si definisce div nel file .ascx deve essere assegnato un id e impostato runat="server", per essere accessibile sul lato server.

Ok, ora aggiungendo un attributo onclick allo div, verrà postback sul server ogni volta che viene fatto clic. Quindi, quando un postback causa il call Page_Load, controllo se era lo div che ha causato il postback. In tal caso, rilancio l'evento UserControl gestito dalla pagina.

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

Questo dovrebbe farlo per il UserControl, ora tutto quello che dovete fare è registrarsi per l'evento DivClicked sulla pagina.

Sfortunatamente, non è possibile ottenere il supporto del tempo di progettazione per registrarsi all'evento. Tuttavia, è ancora possibile aggiungere il codice alla pagina .aspx. Nella pagina in cui inserisci il tuo numero UserControl aggiungi un attributo allo UserControl chiamato OnXXX dove XXX è l'evento del nome. Quindi, per il mio esempio di cui sopra vorrei definire il mio UserControl sulla pagina sarebbe simile a questa:

<uc1:MyUserControl ID="MyUserControl1" runat="server" OnDivClicked="MyUserControl1_DivClicked" /> 

Ora si aggiunge il codice del gestore di file di codebehind il Page s'(supponendo che il utilizzando codebehind) come questo:

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. 
    } 
} 

Che dovrebbe farlo. Spero che questo post ti aiuti.

+1

Wow, che bella spiegazione! Roba molto interessante! Grazie mille! – Martijn

+0

Nessun problema. Felice di poter aiutare – rocka

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

È proprio vero? Conflitti con http://stackoverflow.com/questions/7309718/onserverclick-not-working –

+0

Non ha funzionato per me. –

0

La risposta di Rocka è vicina, ma non del tutto corretta (in quanto non ha funzionato per me, e ho capito perché).

I bit di codice per l'usercontrol di Rocka vanno bene: // Evento per pagina da gestire evento pubblico EventHandler DivClicked;

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

Quando si consumano l'UserControl, il seguente non funziona:

l'OnDivClicked non è il gestore di eventi, è una funzione, quindi non è possibile assegnarlo. per non parlare, quando la funzione si attiva, la variabile del gestore di eventi effettiva è nullo, quindi non eseguirà nulla.

Il modo corretto sarebbe stato:

Questo avrebbe assegnato MyUserControl1_DivClicked di essere il gestore per DivClicked. Purtroppo, questo non funzionava in realtà, quindi nel code-behind nella pagina Page_Load, inserire invece questa riga:

this.MyUserControl1.OnClick + = new EventHandler (MyUserControl1);

Inoltre, come nota a margine, se si rende il div runat = "server", OnClick viene esposto come un evento a cui si potrebbe essere connessi. Tutto ciò che sarebbe necessario è una proprietà passthru per EventHandler nel controllo utente sul div.

0

Nella tua ItemTemplate USO asp: Panel INVECE DI div tag (un pannello rende come un div) e impostare la proprietà Visibilità in questo modo:

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

codice dietro

Panel ImgFeatured = (Panel)e.Row.FindControl("ImgFeatured"); 
ImgFeatured.Visible = true; 
Problemi correlati