Poner el foco en un TextBox que están dentro de un UpdatePanel cuando se produce un postback asíncrono

Hoy estaba realizando unas modificaciones en una aplicación y entre ellas estaba el modificar un control de usuario, poner el foco en un textbox de un edittemplate de un gridview que recoge anotaciones de los usuarios. La cosa es que el gridview está dentro de un UpdatePanel y si optamos por esta solución, nos encontraremos que no funciona:

TextBox textAnotacion = (TextBox)e.Row.FindControl("textAnotacion");
textAnotacion.Focus();

Creo debe ser porque como es un postback asíncrono, sino lo gestionamos a través del ScriptManager que es el encargado de renderizar el contenido del UpdatePanel, no actualiza el foco del TextBox en el caso de usar el método Focus() del control, que sí funciona en el caso de no utilizar UpdatePanel(postback síncrono).

Para que nos funcione correctamente, debemos usar el método SetFocus() del ScriptManager y en mi caso como el ScriptManager está en la MasterPage tengo que utilizar el método GetCurrent(Page) para obtener una instancia del mismo:

TextBox textAnotacion = (TextBox)e.Row.FindControl("textAnotacion");
ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.SetFocus(textAnotacion);

 

Salu2

15 comentarios sobre “Poner el foco en un TextBox que están dentro de un UpdatePanel cuando se produce un postback asíncrono”

  1. Hola , necesito una ayuda , tengo una grilla con con Templates , un boton para editar los ItemTemplates , solucione lo del problema del cursor usando esto:
    private void focoEdicion(int indiceFila,GridView grilla,string control)
    {
    GridViewRow fila = grilla.Rows[indiceFila];
    ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
    scriptManager.SetFocus((fila.FindControl(control)));
    }
    esta funcion ubica el foco cuando EDITO una fila
    mi funcion de editar es:
    protected void imgModificarPais_Click(object sender, ImageClickEventArgs e)
    {

    if(this.hiddenFieldPais.Text.Length!=0)
    {
    this.ISBtxtAccionPais.Text = “EP”;
    int indiceFila = //Aqui ubico la fila que quiero editar
    this.ISBgvPais.EditIndex = indiceFila;
    ListarPaises();
    focoEdicion(indiceFila, this.ISBgvPais, “txtPais”);

    }
    }
    pero parece que tener este codigo que me selecciona la fila a editar:
    protected void ISBgvPais_SelectedIndexChanged(object sender, EventArgs e)
    {
    int fila = ISBgvPoblacion.SelectedIndex + 1;
    this.hiddenFieldPoblacion.Text = fila.ToString();
    }//con esto selecciono la fila

    mantiene seleccionada la fila de la grilla , lo que hace que scriptmanager , ubiqe foco , pero PROBLEMA , cuando quiero ubicarme el otro lado del la caja de texto, al final o al medio ,al parecer hace postback y no me deja ubicarme , pierdo el foco =S.
    Por favor si me podrias ayudar seria de lo mejor , gracias

  2. No te imaginas todo el tiempo que estuve buscando una solución al problema este (en realidad no era el mismo, pero uno muy similar) y nunca encontré nada. Hoy de casualidad llegue a tu blog y me encontré con esta sorpresa. Muchas gracias!

  3. mil gracias estuve buscando mucho tiempo una solucion, probe como mil y no me funcionaba
    y por fin encontre esta pagina
    y me funciono correctamente…

    sin necesidad de escribir mucho codigo

  4. Estimado, yo tengo un problema similar me puedes ayudar; uso Ajas con asp .net. quiero q al presionar enter esta funcione como tab, que vaya al siguiente textbox; he probado con muchas opciones y no he podido solucionar. mis textbox tienes autopostback por lo que cunado le dor enter y si no hubo modificacion del textbox se pierde el enfoque.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *