2008-10-06 84 views
5

A TextBox se establece en AutoPostback ya que al cambiar el valor se debe volver a calcular y mostrar un número de campos (solo visualización).
Eso funciona bien.AutoPostback con TextBox pierde el foco

Sin embargo, cuando se quita el campo de pestañas, el enfoque se mueve brevemente al siguiente campo, luego desaparece cuando la página se vuelve a dibujar 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 determinar qué campo tenía el foco y forzarlo a volver a tenerlo cuando se vuelve a dibujar la página?

Respuesta

3

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 para rastrear el foco, pero encontré el artículo this en CodeProject, que debería ser el truco.

+0

El problema es que necesito para ajustar el enfoque al control que se trasladó a. ¿Hay alguna manera de identificarlo? –

+0

Gracias por su respuesta, korchev, pero no es exactamente lo que quiero. He aclarado mi pregunta. –

+0

Hemos intentado algunos que no funcionaron. La tuya lo hizo Gracias, Korchev. –

1

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

También he propuesto en el servidor puro solution basado en el análisis WebControl.Controls.TabIndex, puede utilizarlo, si lo desea.

1

Esto es lo que está sucediendo:

1) TAB en un campo - evento de cliente
2) Enfoque en el próximo campo - evento de cliente
3) devolución de datos - evento de servidor
4) Página vuelve a dibujar - cliente evento nueva página de eventos de cliente anula preious

la solución del problema es:

a) obtener el elemento que ha ganado atención 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) algún lugar (es decir, un cuadro de texto oculto, vith ViewState = true) Antes de devolución de datos

** b) get ClientID ** (extracto de cuadro de texto oculto y lo puso en var idSelected) después postback

d) obtener el elemento con ClientID y establecer centrarse DESPUÉS devolución de datos

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

Nota: este ejemplo scripts utilizan jQuery.
recuerda 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.
Mira this answer: hacer que el trabajo sobre Javascript Ajax se debe usar un código como éste:

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

    function EndRequestHandler(sender, args) 
    { 
    MyScript(); 
    } 
</script> 
+0

Esta fue una solución muy útil para mí, aunque tuve que usar ambos en 'Sys.Application.add_load (LoadHandler)' (donde 'LoadHandler' es solo una función) para que se vuelvan a llamar en la devolución de datos. ¡Gracias! –

Cuestiones relacionadas