Pregunta

Un TextBox está configurado en AutoPostback , ya que cambiar el valor debería hacer que se recalculen y muestren varios campos (solo de visualización).
Eso funciona bien.

Sin embargo, cuando se saca el campo de una pestaña, el foco se mueve brevemente al siguiente campo y luego desaparece cuando se vuelve a dibujar la página para que no haya foco en ningún lado.

Quiero que el foco esté en el nuevo campo, no en el cuadro de texto que acabo de cambiar. ¿Hay alguna manera de averiguar qué campo tenía el foco y forzarlo a que vuelva a tenerlo cuando se vuelve a dibujar la página?

¿Fue útil?

Solución

Esto es "por diseño". Si está utilizando ASP.NET 2.0+, puede intentar llamar al método Focus de su TextBox una vez que se produce la devolución (preferiblemente en el evento TextChanged del TextBox).

No estoy seguro de si hay alguna forma integrada de rastrear el enfoque, pero encontré este artículo en CodeProject que debería funcionar.

Otros consejos

También podría considerar actualizar campos de solo visualización usando AJAX UpdatePanel . De esta manera no perderá el foco del nuevo campo.

También he propuesto una solución pura del lado del servidor basada en WebControl.Controls .TabIndex , puede usarlo, si lo desea.

Esto es lo que está sucediendo:

1) TAB en un campo - evento del cliente
2) Centrarse en el siguiente campo: evento del cliente
3) Postback - evento del servidor
4) Página redibujada: la página nueva del evento del cliente anula los eventos anteriores del cliente

La solución de su problema es:

a) obtenga el elemento que se ha centrado ANTES de la devolución

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

b) almacenar el ClientID (en realidad en var idSelected ) en algún lugar (es decir, un cuadro de texto oculto, con ViewState = true) ANTES de la devolución

** b) obtener ClientID ** (extraer de TextBox oculto y ponerlo en var idSelected ) DESPUÉS de la devolución de datos

d) obtenga el elemento con ClientID y establezca el enfoque DESPUÉS de la devolución de datos

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

Nota: estos scripts de muestra usan JQuery .
Recuerde poner Jquery.js en su solución y una referencia en su página

<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: esta solución funciona sin AJAX .
Mire esta respuesta : a para que Javascript funcione sobre Ajax, debe usar un código como este:

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

  function EndRequestHandler(sender, args)
  {
    MyScript(); 
  }   
</script>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top