2011-08-08 12 views
5

He conjunto de cuadros de texto en un gridview y utilizo el método Focus() para restaurar el foco después de perder ante el cuadro de texto previsto. El problema es:Cómo prevenir el método de enfoque() de desplazar la página hacia la parte superior

la página (desplazable) y cuando llamo el método de enfoque, en el evento de texto cambiado, el salto de página a la parte superior. Es un comportamiento tan confuso.

Mi pregunta es:

¿Hay alguna manera de evitar que el método Focus() de saltar la página a la cima?

Mi código:

protected void txt_evaluateWeights_TextChanged(object sender, EventArgs e) 
     { 

      calc(); 
      int index = ((System.Web.UI.WebControls.GridViewRow)(((RadTextBox)sender).Parent.NamingContainer)).DataItemIndex; 

      ((RadTextBox)gv_Evaluation.Rows[index + 1].Cells[3].FindControl("txt_evaluateWeights")).Focus();//Here is the problem. 
     } 

Nota:

  • uso el asp:TextBox, y el mismo problema.

  • Mi opinión de la rejilla en un panel de actualización


EDIT:

Javascript solución:

var lastFocusedControlId = ""; 

function focusHandler(e) { 
    document.activeElement = e.originalTarget; 
} 

function appInit() { 
    if (typeof (window.addEventListener) !== "undefined") { 
     window.addEventListener("focus", focusHandler, true); 
    } 
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(pageLoadingHandler); 
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoadedHandler); 
} 

function pageLoadingHandler(sender, args) { 
    lastFocusedControlId = typeof (document.activeElement) === "undefined" 
     ? "" : document.activeElement.id; 
} 

function focusControl(targetControl) { 
    if (Sys.Browser.agent === Sys.Browser.InternetExplorer) { 
     var focusTarget = targetControl; 
     if (focusTarget && (typeof (focusTarget.contentEditable) !== "undefined")) { 
      oldContentEditableSetting = focusTarget.contentEditable; 
      focusTarget.contentEditable = false; 
     } 
     else { 
      focusTarget = null; 
     } 
     try { 
      targetControl.focus(); 
      if (focusTarget) { 
       focusTarget.contentEditable = oldContentEditableSetting; 
      } 
     } 
     catch (err) { } 
    } 
    else { 
     targetControl.focus(); 
    } 

} 

function pageLoadedHandler(sender, args) { 
    if (typeof (lastFocusedControlId) !== "undefined" && lastFocusedControlId != "") { 
     var newFocused = $get(lastFocusedControlId); 
     if (newFocused) { 
      focusControl(newFocused); 
     } 
    } 
} 

Sys.Application.add_init(appInit); 

Respuesta

3

En lugar de tratar de arreglar la forma en que el método de enfoque comporta, hay una alternativa. Yo no lo he probado, pero this page has a discussion of the problem, y un poco de JavaScript del lado cliente para recordar lo que tenía el control del foco, y luego poner el foco de nuevo en ese objeto después de que el UpdatePanel se actualiza. Asegúrese de leer el comentario de algunas actualizaciones del guión.

Si se utiliza este método, se eliminaría la llamada a tratar con seguridad en su código subyacente, y dejar que este acuerdo con la escritura en el cliente.

+0

Muchas gracias por esta gran solución. Edito mi pregunta. ¿Recomiendas alguna mejora a este código? –

+1

No puedo ver ningún problema con él en este momento (realmente no lo he usado). Entonces, si funciona bien para usted en diferentes navegadores, entonces lo dejaría en paz. – patmortech

+0

, pero ¿qué significa '===' en javascript? –

1

Usted puede tratar de utilizar maintainScrollPositionOnPostBac opción k:

<%@ Page MaintainScrollPositionOnPostback="true" %> 
+0

Mi gridview se encuentra en un UpdatePanel –

+0

ninguna devolución de datos ...... –

1

Usted podría utilizar this jQuery plugin para desplazarse a su cuadro de texto:

$(...).scrollTo($('<%= txt_evaluateWeights.ClientID %>')) 
+0

Cómo utilizar esta línea en mi asp.net.I'm no es bueno en 'jquery'. –

1

Usted puede probar esto después de ajustar el enfoque

Response.Write("<script type='text/javascript'>$(...).scollTo($('<%= txt_evaluateWeights.ClientID %>')) 
</script>"); 
1

Esta pregunta se ha hecho un zilliontimes.

Es un error en la biblioteca de JS ASP.NET y la solución es hacky:

var oldScroll = window.scrollTo; 
window.scrollTo = function(){}; 

//... the ugly ASP.NET stuff 

window.scrollTo = oldScroll; 

La solución definitiva a esta es dejar de usar Microsoft ASP.NET y comenzar a usar una tecnología decente que permite que para guiar el lado del cliente.

+0

hmmm, ¿Consideras que asp.net no es una tecnología decente? !! –

+0

Definitivamente no vale la pena el dinero. =) – thwd

+0

pero lo que sé es 'SOF' está construido con esta tecnología. –

2

Si utiliza los paneles de actualización y jquery, la solución es bastante sencilla. Digamos que su ID de cuadro de texto es tbDeliveryCost. En lugar de utilizar tbDeliveryCost.Focus(), haga lo siguiente:

string script = string.Format("$('#{0}').focus();", tbDeliveryCost.ClientID); 
ScriptManager.RegisterStartupScript(this, this.GetType(), "SetFocus", script, true); 
Cuestiones relacionadas