2008-09-03 16 views
5

Estoy usando el control AutoComplete del kit de herramientas de control AJAX de ASP.NET y tengo un problema donde el Autocompletar no se llena cuando configuro el foco en el cuadro de texto asignado.Enfoque de configuración con ASP.NET AJAX Control Toolkit

He intentado establecer el foco en los eventos Page_Load, Page_PreRender y Page_Init y el foco está configurado correctamente, pero el Autocompletar no funciona. Si no configuro el foco, todo funciona bien, pero me gustaría configurarlo para que los usuarios no tengan ese clic adicional.

¿Hay algún lugar especial que necesite para establecer el foco u otra cosa que deba hacer para que esto funcione? Gracias.

Respuesta

3

Tuvimos exactamente el mismo problema. Lo que teníamos que hacer era escribir un guión en la parte inferior de la página que se borrara rápidamente y luego volver a enfocarlo en el cuadro de texto. Puede echar un vistazo a la solución (terriblemente hacky) aquí: http://www.drive.com.au

La ID de la caja de texto es MainSearchBox_SearchTextBox. Echar un vistazo a la línea 586 sobre & se puede ver donde estoy el cableado de todos los eventos (en realidad estoy usando prototipo para este bit.

Básicamente en el caso de foco de la caja de texto que establecer una var global llamada textBoxHasFocus true y en el caso de falta de definición de lo fijo en false el en el evento de carga de la página que llaman a esta secuencia de comandos:..

if (textBoxHasFocus) { 
    $get("MainSearchBox_SearchTextBox").blur(); 
    $get("MainSearchBox_SearchTextBox").focus(); 
} 

esto restablece el cuadro de texto es muy poco fiable, pero es la única solución que pude encontrar

+1

+1 por admitir que es un hack :) – edosoft

0

¿Cómo se establece el enfoque? No he probado el escenario específico que ha sugerido, pero así es cómo Me establecer el foco en mis controles:

Public Sub SetFocus(ByVal ctrl As Control) 
    Dim sb As New System.Text.StringBuilder 
    Dim p As Control 
    p = ctrl.Parent 
    While (Not (p.GetType() Is GetType(System.Web.UI.HtmlControls.HtmlForm))) 
     p = p.Parent 
    End While 
    With sb 
     .Append("<script language='JavaScript'>") 
     .Append("function SetFocus()") 
     .Append("{") 
     .Append("document.") 
     .Append(p.ClientID) 
     .Append("['") 
     .Append(ctrl.UniqueID) 
     .Append("'].focus();") 
     .Append("}") 
     .Append("window.onload = SetFocus;") 
     .Append("") 
     .Append("</script") 
     .Append(">") 
    End With 
    ctrl.Page.RegisterClientScriptBlock("SetFocus", sb.ToString()) 
End Sub 

Por lo tanto, no estoy seguro de qué método se está utilizando, pero si es diferente a la mía, que daría un tiro y ver si usted todavía tiene un problema o no.

0

Lo que normalmente hago es registrar una secuencia de comandos del cliente para ejecutar el método setFocusTimeout a continuación desde mi método codebehind. Cuando esto se ejecuta, espera una pequeña cantidad de tiempo y luego llama al método que realmente establece el foco (setFocus). Es terriblemente hackish, pero parece que tienes que tomar una ruta como esta para evitar que AJAX te robe tu enfoque.

function setFocusTimeout(controlID) { 
    focusControlID = controlID; 
    setTimeout("setFocus(focusControlID)", 100); 
} 

function setFocus() { 
    document.getElementById(focusControlID).focus(); 
} 
0

He encontrado las respuestas de Glenn Slaven y de Kris/Alex conseguirme más cerca de una solución a mi problema particular con el establecimiento de foco en un control ASP.NET TextBox que tenía un AutoCompleteExtender adjunto. El document.getElementById (focusControlID) .focus() siguió arrojando un error de javascript que implicaba que document.getElementById estaba devolviendo un objeto nulo. La variable focusControlID devolvía el valor ClientID del tiempo de ejecución correcto para el control TextBox. Pero por alguna razón, a la función document.getElementById no le gustó.

Mi solución fue lanzar jQuery a la mezcla, ya que ya lo estaba usando para pintar el fondo de cualquier control que tuviera foco, además de forzar la tecla Enter para desplazarme por el formulario en lugar de disparar una devolución de datos.

función Mi setFocus terminó con este aspecto:

function setFocus(focusControlID) { 
    $('#' + focusControlID).blur(); 
    $('#' + focusControlID).focus(); 
} 

Esto se deshizo del error de ejecución JavaScript, puso el foco en el control TextBox deseada, y se coloca el cursor dentro del control también.Sin desenfocar primero y luego enfocar, el control se resaltaría como si tuviera enfoque, pero el cursor aún no estaría en el control. El usuario todavía tendría que hacer clic dentro del control para comenzar a editar, lo que sería una molestia UX.

También tuvo que aumentar el tiempo de espera de 100 a 300. Su kilometraje puede variar ... Mi

Estoy de acuerdo con todo el mundo que este es un truco. Pero desde la perspectiva del usuario final, no ven este código. El truco para ellos es si tienen que hacer clic manualmente dentro del control en lugar de simplemente colocarse automáticamente dentro del control y escribir las primeras letras para activar la función de búsqueda automática. Entonces, felicitaciones a todos los que proporcionaron sus hacks.

Espero que esto sea útil para otra persona.

1

esto es residuos, su simple

esto es lo que hay que hacer

controlId.focus(); en C# controlID.focus() en VB

lugar esto en carga de la página o sección Button_Click

por ejemplo. panel1.focus(); si panel1 tiene un extensor de modelo emergente adjunto, colocamos este código en la sección de carga de la página

Cuestiones relacionadas