Il CalendarExtender è sicuramente un bel controllo. Nel senso che l'idea di base è buona, forse un po' meno l'implementazione attuale. Ci sono infatti una serie di problemi che ne rendono l'utilizzo quantomeno fastidioso.
Dei problemi di memoria ne avevo parlato in un mio precedente post. Se scaricate il codice sorgente dell'ultimo check-in dovrebbero essere risolti o almeno nelle mie applicazioni non si presentano più.
Ci sono però altri problemi. In particolare quando si utilizza un bottone per far aprire il nostro calendario ci sono subito due cose che saltano all'occhio:
- Clikkando sul bottone il popup del calendario viene visualizzato. Se si clikka in un qualsiasi punto dello schermo il calendario non viene nascosto in automatico, ma occorre necessariamente clikkare nuovamente sul bottone per nascondere il calendario.
Questo è un comportamento anomalo per gli utenti, dato che solitamente gli altri calendari che si trovano in giro, non hanno questo comportamento. Non a caso questa modifica è uno dei work item più votati sul sito di CodePlex.
- Quando si clikka sul bottone per visualizzare il calendario viene effettuato un postback della pagina.
Il secondo problema salta fuori quando si utilizza un ImageButton e può risultare fastidioso, prima di tutto per il postback in se e in secondo luogo perchè se si hanno dei validator questi "scattano". Risolvere quest'ultimo problema è banale, basta settare la proprietà CauseValidation dell'ImageButton a False.
Rimane però il postback che, personalmente, trovo inutile. Per risolvere anche questo problema e in attesa che sia fissato ufficialmente, è possibile usare questo workaround:
1
2 <asp:TextBox ID="txtCalendar" runat="server">asp:TextBox>
3
4 <a id="btnCalendar"><img src="images/calendar.png" />a>
5
6 <ajax:CalendarExtender ID="CalendarExtender1"
7 TargetControlID="txtCalendar"
8 PopupButtonID="btnCalendar"
9 runat="server">
10 ajax:CalendarExtender>
Sostanzialmente l'ImageButton viene sostituito da un anchor e da un'immagine. In questo modo il postback iniziale non avviene più e l'apertura del calendario risulta molto più veloce.