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 ClientId
div
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.
Wow, che bella spiegazione! Roba molto interessante! Grazie mille! – Martijn
Nessun problema. Felice di poter aiutare – rocka