Domanda

Un TextBox è impostato su AutoPostback poiché la modifica del valore dovrebbe comportare il ricalcolo e la visualizzazione di un numero di campi (solo visualizzazione).
Funziona bene.

Tuttavia, quando il campo è fuori da una scheda, lo stato attivo passa brevemente al campo successivo, quindi scompare quando la pagina viene ridisegnata in modo che non sia attivo alcun punto.

Voglio che il focus sia sul nuovo campo, non sulla casella di testo che ho appena cambiato. C'è un modo per capire quale campo è stato messo a fuoco e costringerlo ad averlo di nuovo quando la pagina viene ridisegnata?

È stato utile?

Soluzione

Questo è " di progettazione " ;. Se stai usando ASP.NET 2.0+, puoi provare a chiamare il metodo Focus della tua TextBox una volta che si verifica il postback (preferibilmente nell'evento TextChanged della TextBox).

Non sono sicuro che ci sia un modo integrato per tenere traccia del focus, ma ho trovato questo articolo in CodeProject che dovrebbe fare il trucco.

Altri suggerimenti

Potresti anche prendere in considerazione l'aggiornamento dei campi di sola visualizzazione utilizzando AJAX UpdatePanel . In questo modo non perderai la concentrazione dal nuovo campo.

Inoltre ho proposto una soluzione lato server pura basata su WebControl.Controls .TabIndex , puoi usarlo, se lo desideri.

Ecco cosa sta succedendo:

1) TAB su un campo - evento client
2) Focus sul prossimo campo - evento client
3) Postback - evento del server
4) Pagina ridisegnata: la nuova pagina dell'evento client sostituisce gli eventi client precedenti

La soluzione del tuo problema è:

a) ottieni l'elemento che ha guadagnato attenzione PRIMA del postback

<script>
var idSelected;
 $("input").focusin(function () {
         idSelected = this.id;
    });
</script>

b) archivia l'ID client (attualmente in var idSelected ) da qualche parte (ovvero una casella di testo nascosta, con ViewState = true) PRIMA del postback

** b) ottieni ClientID ** (estrai da TextBox nascosto e inseriscilo in var idSelected ) DOPO il postback

d) ottieni l'elemento con ClientID e imposta lo stato attivo DOPO il postback

<script>
$(document).ready(function () {
  if (idSelected != null) {
       $("#" + idSelected).focus();
       idSelected = null;
     });
});
</script>

Nota: questi script di esempio utilizzano JQuery .
Ricorda di inserire Jquery.js nella tua soluzione e un riferimento nella tua pagina

<form id="form1" runat="server" enctype="multipart/form-data" method="post">
   <asp:ScriptManager   runat="server" >
  <Scripts>
   <asp:ScriptReference Path="~/Scripts/jquery.js" ScriptMode="Auto" />
....

Nota2: questa soluzione funziona senza AJAX .
Guarda questa risposta : a per far funzionare Javascript su Ajax devi usare un codice come questo:

<script type="text/javascript">
  Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);

  function EndRequestHandler(sender, args)
  {
    MyScript(); 
  }   
</script>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top