Ajax: Imagebutton esegue evento solo dopo il primo click. AIUTOOOOOO...

mercoledì 11 febbraio 2009 - 10.27

edoardo.tondo Profilo | Newbie

Buongiorno a tutti.
Ho un problema che mi sta facendo impazzire da un giorno e mezzo.
Il problema è il seguente:
Ho creato una pagina di default contenente un updatepanel con all'interno un PlaceHolder, nel quale carico dinamicamente i vari web usercontrol a seconda dell' item del menu selezionato. E fin qui tutto ok.
Ho creato in seguito uno usercontrol che genera un calendario in html in modo dinamico all'interno di una label. La label è a sua volta inserita all'interno di un updatepanel. Lo usercontrol contiene due imagebutton, uno btnIndietro e l'altro btnAvanti, i quali sono stati inseriti all'esterno del UpdatePanel. Spiegato ciò il problema è che l'evendo dei rispettivi imagebutton viene eseguito dopo il primo click.
Mi spiego meglio:
-1° Click ---> l'evento non viene eseguito
-2° Click ---> l'evento viene eseguito
-3° Click ---> l'evento viene eseguito
-4° Click ---> l'evento viene eseguito
-5° Click ---> l'evento viene eseguito
-6° Click ---> l'evento viene eseguito
-7° Click ---> l'evento viene eseguito
- ecc...

Come posso risolvere questo problema? Vi prego aiutatemi fine settimana prossima devo consegnare il progetto

Saluto e vi ringrazio tutti anticipatamente

balfaz Profilo | Expert

puoi farci vedere un po di codice, primo del markup e poi un po di behind

"Che in questo 2009 i nostri codici possano sconvolgere il mondo."

edoardo.tondo Profilo | Newbie

Codice HTML:

<table width="100%" height="100%" border="1" cellpadding="0" cellspacing="1" bordercolor="#CCCCCC" class="MenuSxTxt">
<tr bgcolor="#E6E6E6">
<td width="10%" height="3px">VISTA APPUNTAMENTI</td>
</tr>
<tr bordercolor="#FFFFFF">
<td valign="top" align="center">
<table border="0" bordercolor="#CCCCCC" cellspacing='0' collspacing='0' width="100%">
<tr style="text-align: center;">
<td width="5%" align="left" valign="top">
<asp:ImageButton ID="btnIndietro" runat="server" CausesValidation="false" OnClick="btnIndietro_Click"
ImageUrl="~/img/indietro.gif" />
</td>
<td width="90%" colspan="5" align="center">
<asp:Label ID="lblMeseAnno" runat="server"></asp:Label>
</td>
<td width="5%" align="right" valign="top">
<asp:ImageButton ID="btnAvanti" runat="server" onclick="btnAvanti_Click"
ImageUrl="~/img/next.gif" />
</td>
</tr>
</table>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="False" RenderMode="Inline" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lblCalendario" runat="server"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnIndietro" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnAvanti" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</td>
</tr>
</table>

Codice C#:

protected void Page_Load(object sender, EventArgs e)
{
//if (!Page.IsPostBack)
//{
UtilityDataTempo utilCal = new UtilityDataTempo();
mese.Value = DateTime.Now.Month.ToString();
anno.Value = DateTime.Now.Year.ToString();
lblCalendario.Text = utilCal.GeneraCalendario(Convert.ToInt32(mese.Value), Convert.ToInt32(anno.Value));
lblMeseAnno.Text = utilCal.getMonthName(Convert.ToInt32(mese.Value)).ToUpper() + " " + anno.Value.ToString();
//}
}

protected void btnIndietro_Click(object sender, EventArgs e)
{
UtilityDataTempo utilCal = new UtilityDataTempo();
if (mese.Value.ToString() == "1")
{
mese.Value = "12";
anno.Value = Convert.ToString(Convert.ToInt32(anno.Value) - 1);
}
else
{
mese.Value = Convert.ToString(Convert.ToInt32(mese.Value) - 1);
}
lblCalendario.Text = "";
lblCalendario.Text = utilCal.GeneraCalendario(Convert.ToInt32(mese.Value), Convert.ToInt32(anno.Value));
lblMeseAnno.Text = utilCal.getMonthName(Convert.ToInt32(mese.Value)).ToUpper() + " " + anno.Value.ToString();
}

protected void btnAvanti_Click(object sender, EventArgs e)
{
UtilityDataTempo utilCal = new UtilityDataTempo();
if (mese.Value.ToString() == "12")
{
mese.Value = "1";
anno.Value = Convert.ToString(Convert.ToInt32(anno.Value) + 1);
}
else
{
mese.Value = Convert.ToString(Convert.ToInt32(mese.Value) + 1);
}
lblCalendario.Text = "";
lblCalendario.Text = utilCal.GeneraCalendario(Convert.ToInt32(mese.Value), Convert.ToInt32(anno.Value));
lblMeseAnno.Text = utilCal.getMonthName(Convert.ToInt32(mese.Value)).ToUpper() + " " + anno.Value.ToString();
}

balfaz Profilo | Expert

prova per adesso a sostituire la tua tag updatepanel cosi
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">

vediamo un po
"Che in questo 2009 i nostri codici possano sconvolgere il mondo."

edoardo.tondo Profilo | Newbie

Non è cambiato assolutamente nulla è come se al primo click rigenera la pagina

balfaz Profilo | Expert

togli i trigger della'updatepanel
e nel tuo codice fai questo
protected void btnIndietro_Click(object sender, EventArgs e)
{
UtilityDataTempo utilCal = new UtilityDataTempo();
if (mese.Value.ToString() == "1")
{
mese.Value = "12";
anno.Value = Convert.ToString(Convert.ToInt32(anno.Value) - 1);
}
else
{
mese.Value = Convert.ToString(Convert.ToInt32(mese.Value) - 1);
}
lblCalendario.Text = "";
lblCalendario.Text = utilCal.GeneraCalendario(Convert.ToInt32(mese.Value), Convert.ToInt32(anno.Value));
lblMeseAnno.Text = utilCal.getMonthName(Convert.ToInt32(mese.Value)).ToUpper() + " " + anno.Value.ToString();

updatepanel1.update() <---aggiunge questa riga
}
"Che in questo 2009 i nostri codici possano sconvolgere il mondo."

edoardo.tondo Profilo | Newbie

Forse non hai capito bene il problema. Al primo click non entra proprio nell'evento è dal secondo click in poi che esegue le istruzioni dell'evento

balfaz Profilo | Expert

aahhh, ho capito
allora ho visto che hai tolto l'if (!Page.IsPostBack), come mai??

Hai fatto il debug del codice è vedere cos'è che fa lui prima d'arrivare al click de bottone

"Che in questo 2009 i nostri codici possano sconvolgere il mondo."

edoardo.tondo Profilo | Newbie

Se decommento l' if del Page_Load non esegue le istruzioni all'interno dell'if.
Con il primo click mi esegue solo il Page_Load mentre dal secondo in poi mi esegue sia il Page_Load che l'evento

balfaz Profilo | Expert

vuoi dire che ci conti con l'evento pageload per fare un postback asincrono???

se fosse si allora è sbagliato

ti consiglio di far diventare la procedura del load una procedura recursiva (che puoi richiamare ogni volta che sia necessaria), cosi la richiami al load della pagina con il if !page.ispostback e poi la richiami dall'evento click. Solo per cominciare

Poi se questo non sistemasse il problema dobbiamo continuare a cercare cos'è che da fastidio, perché la struttura della pagina e dell'updatepanel è corretta

Ooooppsss!!!, quasi mi dimenticavo mette la proprietà dell'updatepanel UpdateMode = "Always"

"Che in questo 2009 i nostri codici possano sconvolgere il mondo."

edoardo.tondo Profilo | Newbie

Risolto!!!
La soluzione è in fondo a questa pagina: http://www.omgili.com/newsgroups/microsoft/public/it/dotnet/asp/1194424513004788225790y42g2000hsygooglegroupscom.html&q=dinamicamente

balfaz Profilo | Expert

ok, ben per te.

Ho capito bene, che alla fine erano i usercontrol la base del problema??

"Che in questo 2009 i nostri codici possano sconvolgere il mondo."

balfaz Profilo | Expert

alla fine cosa ci racconti sei riuscito a fare qualcosa???

"Che in questo 2009 i nostri codici possano sconvolgere il mondo."
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5