Supponiamo di avere un UpdatePanel al cui interno abbiamo inserito un controllo Panel, impostando la sua proprietà ScrollBars su Auto, in modo da visualizzare automaticamente le barre di scorrimento nel caso in cui gli oggetti che contiene non siano completamenti visibili. Se uno di questi ultimi determina un PostBack, l'UpdatePanel ci garantisce che sono il pannello sarà aggiornato. La posizione delle barre di scorrimento, tuttavia, non sarà mantenuta, quindi il controllo "resetterà" le sue coordinate di visualizzazione, mostrando inesorabilmente l'angolo in alto a sinistra.
Per risolvere il problema, si deve utilizzare un piccolo "trucco" basato su Javascript:
1 <script type="text/javascript">
2 var xPos, yPos;
3 var prm = Sys.WebForms.PageRequestManager.getInstance();
4 prm.add_beginRequest(BeginRequestHandler);
5 prm.add_endRequest(EndRequestHandler);
6 function BeginRequestHandler(sender, args) {
7 var panel = $get('<%= pnlCategorie.ClientID %>');
8 if (panel != null) {
9 xPos = panel.scrollLeft;
10 yPos = panel.scrollTop;
11 }
12 }
13 function EndRequestHandler(sender, args) {
14 var panel = $get('<%= pnlCategorie.ClientID %>');
15 if (panel != null) {
16 panel.scrollLeft = xPos;
17 panel.scrollTop = yPos;
18 }
19 }
20 </script>
La funzione BeginRequestHandler (righe 6-12) viene invocata prima che la chiamata asincrona sia effettivamente eseguita. In essa recuperiamo la posizione delle barre del panello che ci interessa, posizione che ripristiniamo nella funzione EndRequestHandler (right 13-19), che è invocata al termine della procedura asincrona. In questo esempio, utilizziamo un Panel di nome pnlCategorie (riga 7 e 14); è semplice modificare le routine in modo che mantengano la posizione di più pannelli.
L'unica accortezza che si deve avere è inserire questo codice dopo la creazione dello ScriptManager di ASP .NET AJAX (quindi, ad esempio, alla fine della pagina ASPX contenente i pannelli).