Question

Un TextBox est défini sur AutoPostback , car la modification de la valeur devrait entraîner le recalcul et l'affichage d'un certain nombre de champs (d'affichage uniquement).
Cela fonctionne bien.

Toutefois, lorsque le champ est désactivé, le focus passe brièvement au champ suivant, puis disparaît lorsque la page est redessinée, de sorte qu'il n'y a plus de focus nulle part.

Je souhaite que l'accent soit mis sur le nouveau champ, et non sur la zone de texte que je viens de modifier. Existe-t-il un moyen de déterminer quel champ était ciblé et de le forcer à le retrouver lorsque la page sera redessinée?

Était-ce utile?

La solution

C’est "de par leur conception". Si vous utilisez ASP.NET 2.0+, vous pouvez appeler la méthode Focus de votre zone de texte une fois la publication terminée (de préférence dans l'événement TextChanged de la zone de texte).

Je ne sais pas s'il existe un moyen intégré de suivre le focus, mais j'ai trouvé cet article dans CodeProject qui devrait faire l'affaire.

Autres conseils

Vous pouvez également envisager d'actualiser les champs d'affichage uniquement à l'aide d'AJAX UpdatePanel . De cette façon, vous ne perdrez pas le focus du nouveau champ.

J'ai également proposé une solution pure basée sur WebControl.Controls .TabIndex , vous pouvez l’utiliser si vous le souhaitez.

Voici ce qui se passe:

1) Onglet sur un champ - événement client
2) Concentrez-vous sur le prochain champ - événement client
3) Postback - événement de serveur
4) Page redessinée - la nouvelle page d'événement client annule les événements client antérieurs

La solution à votre problème consiste à:

a) récupérez l'élément qui a gagné le focus AVANT la publication

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

b) stockez le ClientID (dans var idSelected ) quelque part (par exemple, une zone de texte masquée, avec ViewState = true) AVANT la publication

** b) récupère ClientID ** (extrait de la zone de texte masquée et le place dans var idSelected ) APRES la publication

d) récupérez l'élément avec ClientID et définissez le focus APRES la publication

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

Remarque: ces exemples de scripts utilisent JQuery .
N'oubliez pas de mettre Jquery.js dans votre solution et une référence dans votre page

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

Remarque 2: cette solution fonctionne sans AJAX .
Regardez cette réponse : à Pour que Javascript fonctionne avec Ajax, vous devez utiliser le code suivant:

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

  function EndRequestHandler(sender, args)
  {
    MyScript(); 
  }   
</script>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top