asp.net - AutoPostback con TextBox pierde foco
focus (3)
Un TextBox
está configurado en AutoPostback
ya que al cambiar el valor se debe recalcular y visualizar una cantidad de campos (solo visualización).
Eso funciona bien
Sin embargo, cuando se quita el campo de pestañas, el foco pasa brevemente al siguiente campo y luego desaparece cuando se vuelve a dibujar la página para que no haya foco en ninguna parte.
Quiero que el foco esté en el nuevo campo, no en el cuadro de texto que acabo de cambiar. ¿Hay alguna forma de averiguar qué campo tenía el foco y obligarlo a volver a tenerlo cuando se vuelva a dibujar la página?
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 produzca la devolución (preferiblemente en el evento TextChanged del TextBox).
No estoy seguro de si hay alguna forma incorporada de seguir el enfoque, pero encontré este artículo en CodeProject, que debería ser el truco.
Esto es lo que está sucediendo:
1) TAB en un campo - evento del cliente
2) Foco en el siguiente campo - evento del cliente
3) Postback - evento del servidor
4) Página redibujada: la nueva página del evento del cliente anula los eventos de clientes preciados
La solución de tu problema es:
a) obtener el elemento que se ganó el enfoque ANTES de la devolución de datos
<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 Textbox oculto, con ViewState = true) ANTES de la devolución de datos
** b) obtener ClientID ** (extracto de TextBox oculto y ponerlo en var idSelected
) DESPUÉS de la devolución de datos
d) obtener el elemento con ClientID y establecer el foco DESPUÉS de la devolución de datos
<script>
$(document).ready(function () {
if (idSelected != null) {
$("#" + idSelected).focus();
idSelected = null;
});
});
</script>
Nota: estas secuencias de comandos 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" />
....
Nota 2: esta solución funciona sin AJAX .
Mire esta respuesta : para hacer 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>
También podría considerar actualizar los campos de solo visualización utilizando AJAX UpdatePanel . De esta manera no perderás el enfoque del nuevo campo.
También he propuesto una solución pura del lado del servidor basada en el análisis de WebControl.Controls.TabIndex , puede usarla, si lo desea.