Call parent page method (EventBubble) |
Visite: 8104 |
martedì 4 aprile 2006 |
Page not translated!
I'm sorry but the text of this page doesn't have translation at this time.
Oggi vi illustrerò come richiamare una funzione della
pagina ASPX da uno User Control contenuto in essa.
Non è una prassi molto comune, solitamente ci si trova davanti situazioni
inverse, dove dalla pagina ASPX è necessario richiamare un metodo o una
proprietà del controllo figlio. In questo caso basta semplicemente dichiarare
come Public il metodo o la proprietà in oggetto e richiamare il controllo
tramite il nome assegnatogli in fase di dichiarazione.
A volte però ci si può trovare di fronte ad una situazione differente. Può capitare di dover richiamare un metodo
della pagina ASPX direttamente dallo User Control contenuto al suo interno.
Esistono alcune soluzioni semplici e veloci (utilizzare le sessioni o i cookie
ad esempio) ma tutte queste hanno un piccolo difetto: vengono eseguite dopo
il caricamento del controllo. Ciò vuol dire che, se ad esempio settiamo una
variabile di sessione pippo a 1, avremo a disposizione il valore 1
esclusivamente dopo, in modo sequenziale, alla lettura, da parte del
compilatore, della riga nella sezione HTML dove è presente il controllo. Se
siete stati fortunati fin d'ora, potreste aver adottato questa soluzione e
risolvere il vostro piccolo problema, altrimenti se questo metodo d'azione è per
voi diventato quasi un dilemma, vi consiglio di
continuare con la lettura..
Come esempio, costruirò una pagina ASPX contenente uno User Control che a sua
volta conterrà un bottone. Vogliamo far sì che lo User Control possa eseguire un
metodo presente nella pagina ASPX.
Partiamo con lo scrivere il codice per lo User Control:
<%@ Control Language="C#" %>
<script runat="server">
// dichiaro l'handler degli eventi pubblico
public event EventHandler ButtonClick;
protected void OnUserControlClick(EventArgs e) {
// metodo sostitutivo dell'evento Click del bottone
// qui rimando l'evento Click all'EventHandler del controllo
if ( ButtonClick != null ) {
ButtonClick(this, e);
}
}
void btnClick_Click(object sender, EventArgs e) {
// aggiungo l'evento Click del bottone all'handler degli eventi
OnUserControlClick(e);
}
</script>
<!-- bottone di esempio -->
<asp:Button id="btnClick"
onclick="btnClick_Click"
Text="Clicca qui"
runat="server"
/>
Come prima cosa ho dichiarato un evento pubblico nominandolo ButtonClick.
Utilizzerò questo evento poi nella pagina ASPX contenente lo User Control in
questione.
Ho creato poi un metodo OnUserControlClick che riceve come parametro gli
argomenti dell'evento. A questo metodo invieremo l'evento Click del
bottone che assegneremo poi all'handler degli eventi ButtonClick. Così
facendo, dalla pagina ASPX potremo intercettare l'evento Click del
bottone perchè ormai presente nell'EventHandler pubblico ButtonClick.
Ora, non basta che creare la pagina ASPX che conterrà lo User Control:
<%@ Page Language="C#" %>
<%@ Register TagPrefix="devexperience" TagName="button" Src="UserControl.ascx" %>
<script runat="server">
void Page_Init(object sender, EventArgs e) {
// aggiungo l'evento Click del bottone dello usercontrol
// all'handler degli eventi per questa pagina aspx
devButton.ButtonClick += new EventHandler(UserControlButton_Click);
}
void UserControlButton_Click(object sender, EventArgs e) {
// questo è l'evento Click del bottone dello usercontrol
Response.Write("Ciao, sono la pagina principale, hai cliccato il bottone dello UserControl!");
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
Bottone dello UserControl:<br />
<devexperience:button id="devButton" runat="server"></devexperience:button>
</form>
</body>
</html>
Come prima cosa è necessario aggiungere all'handler degli eventi dello User
Control, l'evento UserControlButton_Click presente nella pagina ASPX e
che ci darà la possibilità di gestire le operazioni da eseguire al verificarsi
dell'evento Click del bottone presente nello User Control. Lo User
Control sarà quindi in grado di eseguire il metodo UserControlButton_Click
della pagina ASPX (ogni volta che l'evento Click del bottone sarà
richiamato dall'handler).
devButton.ButtonClick += new EventHandler(UserControlButton_Click);
Inseriamo questo codice all'Init della pagina, altrimenti
non saremo in grado di utilizzare l'handler.
Ovviamente è possibile utilizzare il metodo della pagina ASPX al verificarsi di
diversi eventi; come esempio ho ipotizzato il Click di un bottone, ma è
possibile utilizzare lo stesso codice anche per eventi diversi (come ad esempio
SelectedIndexChanged dei controlli DropDownList o CheckBox).
nessun commento da segnalare...
Scrivi nuovo commento