Error de Codificación al Recuperar Datos con Caracteres Especiales Como la Letra Ñ de Gridview a un TextBox

Como es costumbre este post se origina con la consulta de una amiga, que me solicitó ayuda con un pequeño problema que se le presentó (el problema parecía tan pequeño que hasta se sonrojaba al hacer la consulta).

El Problema
Al recuperar los datos de un campo de la fila seleccionada en un GridView, a un control TextBox, manda caracteres extraños cuando se tratan de letras especiales como la “ñ” o las vocales con tilde, para recuperar los datos se utiliza el siguiente código en el evento RowCommand, del GridView.

protected void GridView1_RowCommand(object sender,
    GridViewCommandEventArgs e)
{
     if(e.CommandName == «Select»)
     {
        //Seleccionamos la Fila Actual
        GridView1.SelectedIndex =
            Convert.ToInt32(e.CommandArgument.ToString());

         //Recuperamos el valor de la segunda celda
        TextBox1.Text = GridView1.SelectedRow.Cells[1].Text;
     }
}

La Solución
Desde el inicio sospeché que el problema se trataba de la codificación de la página, recordé un post que había leído solo hace un momento donde se mostraba la forma de poner la codificación por defecto, seguí los pasos que se indicaban, pero no solucionó el problema.

Entonces hice la prueba cambiando el control TextBox por un control Label, grande fue mi sorpresa cuando todo funcionó a la perfección, entonces el problema estaba en el TextBox que por alguna razón no decodificaba los caracteres especiales.

Luego recordé que había una función para codificar texto que se utilizaba en seguridad, para evitar que el usuario ingrese caracteres especiales HttpUtility.HtmlEncode() y su correspondiente método para decodificarlo HttpUtility.HtmlDecode(). Como el problema es que los caracteres están codificados y por alguna razón extraña que no llego a entender no se decodifica al asignarlo a un TextBox, para solucionarlo tenemos que utilizar HttpUtility.HtmlDecode(), para decodificarlo manualmente.

protected void GridView1_RowCommand(object sender,
    GridViewCommandEventArgs e)
{
    if(e.CommandName == «Select»)
    {
        //Seleccionamos la Fila Actual
        GridView1.SelectedIndex =
            Convert.ToInt32(e.CommandArgument.ToString());

        //Recuperamos el valor de la segunda celda decodificándola
        TextBox1.Text =
            HttpUtility.HtmlDecode(GridView1.SelectedRow.Cells[1].Text);

    }
}

48 comments so far

  1. Alexander on

    Excelente Articulo muchas gracias, no sabia de la decodificacion y yo pasaba los valores al textbox asi.
    Dim fila As GridViewRow
    fila = GridView1.SelectedRow

    TextBox1.Text = fila.Cells(1).Text

    Gracias y saludos

  2. eloyparedes on

    Hola Alexander, me da gusto saber que a alguien le sirve la información que publico en este blog.

  3. angelestradamx on

    Excelente solución, estaba buscando y buscando en la red algo para solucionar este problema. Gracias.

    GridViewRow row = VerProductos.SelectedRow;
    CeldaDescripción =HttpUtility.HtmlDecode( row.Cells[1].Text);

  4. Natali on

    HOLA. GRACIAS POR LA EXPLICACION.
    PERO TENGO UNA DUDA..COMO PUEDO HACER ESTO EN VB.NET?..ESTOY TRABAJANDO EN PAGINAS DISEÑADAS CON ASP.NET PERO INTENTE PASAR ESTA SOLUCION A MI PROYECTO PERO ME GENERA ERRORES..SI PUEDES ENVIARME UNA IDEA AL CORREO TE LO AGRADECERIA MUSCHISIMO MAS…

  5. eloyparedes on

    Hola Natali, asegúrate de agregar una columna de tipo ButtonField y que en la propiedad CommandName pusiste «Select». Luego el código en el controlador de evento RowCommand es el mismo solo que con sintaxis VB, aquí te puse la traducción :

    If (e.CommandName = «Select») Then
        ‘Seleccionamos la Fila Actual
        GridView1.SelectedIndex =
    Convert.ToInt32( _
           
    e.CommandArgument.ToString())

        ‘Recuperamos el valor de la segunda
    celda decodificándola
        TextBox1.Text = HttpUtility.HtmlDecode( _
           
    GridView1.SelectedRow.Cells(1).Text)
    End If

    Si necesita que te envíe un pequeño ejemplo solo pídemelo.

  6. Patricia on

    Hola
    gracias por la ayuda que nos das con tus articulos, pero tengo una duda, el problema de los caracteres no se me presenta al pasar te textbox a grilla, sino que en cada ida al servidor los caracteres especiales del texto de otros textbox cambia a estos caracteres extraños.
    Si pudieras ayudarte te estaria muy agradecida

  7. eloyparedes on

    Hola patricia

    Ese problema puede estar relacionado con la
    configuración regional del sistema operativo que utilizas
    para visualizar las páginas, para solucionar esto
    podrías forzar a que el navegador utilice
    codificación Unicode, esto lo puedes hacer en el archivo de
    configuración Web.config entre las etiquetas
    <system.web> y </system.web> escribiendo la
    siguiente configuración:

    < globalization
            
    requestEncoding=»utf-8″
            
    responseEncoding=»utf-8″
    />

    Espero que esto solucione tu problema.

  8. Julio on

    Hola eloyparedes, que buen artículo, hasta ahora lo veo porque tuve un problema similar y pude resolverlo gracias a este.
    Pero quisiera saber si me puedes ayudar con otro problema,

    Estoy llenando un Gridview con un dataset que trae una consulta de Oracle y todo funciona bien hasta el momento de mostrar la información, los datos no los muestra correctamente, me corta las palabras si se repiten en diferentes filas de la misma columna es decir si en la primera columna de la 1ra fila muestra la palabra casa y en la 2da fila 1ra columna tambien trae la palabra casa la muestra si el último caracter (cas). Esto es lo más claro que pude explicarme, pero si me puedes ayudar en algo te lo agradezco, ah se me olvidava es asp net con vb.
    saludos

  9. Manuel on

    Hola a todos, desde Panamá te mando las gracias por esta explicacion

  10. Yu on

    Para 2005 utilicen Server.HtmlDecode

  11. Guillermo on

    Antes q nada mil gracias por el truco. Pero ya que estamos aqui deja exponer mi problema: Resulta que estoy tratando de leer unos datos (direccion de un servidor BD), desde un TextBox el problema es que las diagonales invertidas «\» me las pone dobles, osea le pongo «Equipo\\Servidor» y me pone «Equipo\\\\Servidor». Se que es algo acerca de los carcateres de escape que usa c# pero no se como resolverlo.
    De antemano Gracias por tu atenciòn

  12. daniel on

    felicitaciones maestro te pasaste con esa pequeña investigación me fue de mucha ayuda…

  13. AleHoO on

    Excelente articulo, pero no hay forma de dejar esta funcionalidad global a la aplicación?? intenté con el globalization pero no me funionó… Gracias

  14. norman on

    Para 2005 utilicen Server.HtmlDecode!
    Gracias totales!

  15. sebasgn on

    hola estubo todo bn

  16. richard on

    Tengo un problema, tengo una pagina en asp.net , cuando coloco en un texbox la letra ñ al actualizar la pagina entos carateres cambian a caracteres extraños, entonces logicamente cuando quiero trabajar con estos datos la aplicacion se cae.

    Puedo validar para q no se caiga, pero lo que quiero es q no haya tal cambio de la ñ a caracteres raro.

    Si alguien me puede ayudar se lo agardeceria mucho.

  17. VICTOR on

    excelente amigo,, me sirvio de mucho, aparte pues tantos problemas que da, y una simple linea de codigo lo soluciona. yuhu! gracias

  18. Hortencia on

    Hola un problema con las tildes y eñes. Para una información que quiero mostrar por un dataset.
    Estos registros lo obtengo de una base de datos en Sybase y lo muestro en xml a través del dataset. Pero las tildes y las eñes me salen con caracteres extraños.. ya modique en el web.config con estas lineas pero no funciona.

  19. Jesus Garibay Ceja on

    Ok, me funciono a la perfeccion. =)

  20. hola on

    Gracias! =D I love you!!!!!! xD

  21. Alejandro on

    GRACIAAAAAAAAAAAAAASSSSSSSSSSSSs.. me estaba poniedo histerico con ese problema. muchas gracias. muchas muchas gracias.

  22. maria esther on

    gracias, justo lo que buscaba

  23. Danny on

    Hombre! El post podrá ser muy viejo pero en el futuro sigue ayudándonos jajaja. Gracias man!

  24. yansi on

    Necesito hacer lo mismo con ASp clásico sin tener que cambiar el charset=iso-8859-1. Cuando se muestran los datos provenientes de una de base de datos en un presentan caracteres extraños, pero al seleccionar uno y guardarlo en BD si se guardan con acento las palabras, si uso charset=utf-8 en la página sí se muestran bien en el pero se guardan mal, con caracteres raros en la base de datos.

  25. Armando on

    Muchisimas Gracias llevaba rato dándole vueltas al tema, solucionado.

  26. CaroVeg on

    Muchísimas gracias por tu post, fue de gran ayuda

  27. Egm1207 on

    Muchas gracias me sirvió al 100% 🙂

    textbox.text = HttpUtility.HtmlDecode (grid.Rows(0).Cells(0).Text)

  28. bryan on

    gracias brother me sirvio de mucho en mi sistema. :)))

  29. BGR on

    gracias!

  30. pepe on

    Muy buena me salvaste la vida

  31. Gabo Rodríguez on

    muy buena maestro me salvaste!!! mi sirvió un monton

    saludos!

  32. dany on

    Excelente funciono a la perfección demasiado bueno tu post

  33. Emiliano on

    Muy bueno, busqué mucho y no encontré esta solución tan efectiva y sencilla.

    Muchas gracias.
    Abrazo.

  34. Daniel Armando on

    Como leí en comentario más antiguos, puede ser muy viejo el post pero de verdad que si sigue ayudando mucho, gracias me diste una salvada!! 😀

  35. Fernando Távara on

    Genial!!! Gracias!

  36. Edgar Mendoza on

    EXCELENTE… cuanto batalle.. mil gracias….!!!!!

  37. libo on

    Gracias amigo me funciono y muchsisimas gracias

  38. Cesar on

    Me has salvado la vida!!

  39. Funciono perfecto

  40. Leticia on

    😀 es lo que esta buscando muchas gracias por el aporte!!!

  41. Víctor on

    GRAAAACIAS.
    Blessings

  42. Rolando Cano on

    Muchas gracias mi estimado,

    Funcionó perfectamente, me evitaste muchos dolores de cabeza 🙂

    Saludos

  43. armando on

    ufff geniaal, pense que tendria que tomar cada caracter y convertilo. Gracias!!

  44. Janny on

    Muchas muchas gracias!!

  45. Franco Antonio Saavedra Peña on

    Gracias amigo me salvaste!!!!!

  46. Jorge Vargas on

    Gracias, era justo la solución que buscaba.

  47. adan on

    gracias amigo, es grande tu conocimiento, pero mas grande es tu humanidad por querer compartirlo…

  48. Julio Rodriguez on

    Muchas gracias hermano ,sos un crack..Saludos desde Nicaragua ,me sirvio a la perfeccion.


Replica a Guillermo Cancelar la respuesta