已答复 Problema DataBind()

  • lunes, 21 de mayo de 2012 7:35
     
     

    Hola buenas,

    Tengo un GridView el cual contiene un listado y un botón para descargar un fichero, cuando le doy a descargar el listado, las lineas que se guardan en el fichero deben desaparecer actualizando el gridview con las filas que no se han descargado.

    El problema es cuando yo le doy al botón para descargar el fichero, me descarga el fichero pero no actualiza el gridview, usando el DataBind();

    ¿Cómo puedo generar un postback automático u obligar a realizar una actualización después de la descarga del fichero?

    Un saludo.

Todas las respuestas

  • lunes, 21 de mayo de 2012 13:50
    Moderador
     
     

    Yo haría del botón un botón tipo Button de los que hacen postback.  Luego proceso el postback y hago el DataBind() del caso y finalmente introduzco un Javascript en window.onload para que inicie la descarga del archivo.  De esta manera la página hace postback y el postback, cuando termina de cargar, inicia la descarga del archivo.


    Jose R. MCP

  • lunes, 21 de mayo de 2012 15:59
    Moderador
     
     

    las lineas que se guardan en el fichero deben desaparecer actualizando el gridview con las filas que no se han descargado.

    algo en lo que comentas no tiene sentido

    cual es el origen de datos que suas para cargar las filas del gridview ?

    el boton que mencioasn donde se encuentra ? es por fuera del grid

    si necesitas eliminar el contenido de un archivo simplemente lo eliminas y creas uno nuevo con el mismo nombre, no hay algo que elimine contenido que planteas

    ¿Cómo puedo generar un postback automático u obligar a realizar una actualización después de la descarga del fichero?

    simplemente sigues los pasos

    - tomas la info del gridview y la vuelcas al archivo

    - actualizas el gridview asignado un nuevo datasource que refleje la nueva info

    - realizas el Response.WriteFile() para enviar el archivo al cliente y ve el cuadro de descarga para grabarlo

    o sea sigues ese orden, no es que envias a descargas proque es logico que esto evitara que el grid pueda actualizarse, por eso priemro actualzias el contrl con los nuevos datos y luego produces la descarga

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

  • martes, 22 de mayo de 2012 6:44
     
     

    Hola buenas.

    Tengo un GridView que carga los datos a través de un ObjectDataSource con el SelectMethod, y un botón que se encuentra fuera del GridView.

    El Gridview carga unos datos que tienen un estado. Y al pulsar el botón recorro el gridview comprobando si están activaos los checkbox que tiene cada fila y aquellos que estén activados los introduzco en un fichero .TXT y cambio su estado.

    Al terminar la creación del fichero quiero actualizar el GridView quitando los datos que ya no tengan el estado inicial y ejecutar la descarga.

    Pero al ejecutar la descarga este hace un Response.Flush() y Response.End() y finaliza la llamada Response y no hace la actualización de la página. Pero si descarga el fichero.

    PD: Programo en C#.

    Un saludo y gracias por la ayuda.

  • martes, 22 de mayo de 2012 8:01
     
     

    Yo haría del botón un botón tipo Button de los que hacen postback.  Luego proceso el postback y hago el DataBind() del caso y finalmente introduzco un Javascript en window.onload para que inicie la descarga del archivo.  De esta manera la página hace postback y el postback, cuando termina de cargar, inicia la descarga del archivo.


    Jose R. MCP

    ¿Como puedo llamar desde el javascript a la funcion c# para descargar el fichero?
  • martes, 22 de mayo de 2012 19:15
    Moderador
     
     
    No ocupa nada particular.  Sería un javascript tipo window.location = <URL del archivo de texto>;.  Esto hará que se inicie la descarga.  Si la ruta del archivo es dinámica, la puede escribir dentro del Javascript en las formas usuales (llaves <% %> en el ASPX, o ClientScript.RegisterBlock() con el URL concatenado, etc.).

    Jose R. MCP

  • miércoles, 23 de mayo de 2012 11:45
     
     

    ¿Pero con window.location  puedo iniciar una descarga de un fichero que hay en mi servidor? 

    Ya que sería descargar un fichero que se encuentra en :

    pej: c\www\root\web\fichero.txt y no en http://miweb.com/fichero.txt

    ¿Cómo de seguro es esto?

    Un saludo y gracias por la ayuda.

  • miércoles, 23 de mayo de 2012 14:31
    Moderador
     
     
    Sí:  window.location puede iniciar descargas.  Todo depende del tipo MIME del archivo a descargar.  Si el explorador conoce el tipo MIME y puede desplegarlo, entonces lo mostrará; si no, entonces lo descargará.

    Jose R. MCP

  • jueves, 24 de mayo de 2012 18:00
     
     

    Nada no consigo realizar la actualización del GridView y posteriormente ejecutar la descarga.

    No hay ninguna manera de generar un Postback después de realizar un Response.End(), ya que este termina con el proceso de la página.

    si realizo un

    GridView1.Bind();

    y luego

    DownloadFile(nombreFichero); 

    Una vez se abre la ventana para descargar el fichero, se termina el proceso de carga de la página sin llegar a actualizar el GridView, alguna idea? porque estoy empezando a pensar otras alternativas para realizar lo que quiero hacer.

    PD: he probado a meter el GridView en un UpdatePanel pero nada, si quito la descarga del archivo si que realiza el Bind correctamente, pero al meter el codigo de descarga, este suspende el proceso de carga.

    Muchas gracias por la ayuda.

  • jueves, 24 de mayo de 2012 18:15
    Moderador
     
     
    Después de hacer un DataBind() yo sugerí registrar un Javascript que corra en window.onload que utilice window.location para navegar hacia el archivo a descargar.  ¿Lo ha probado de esta manera?  ¿Qué es ese "DownloadFile()" que menciona?

    Jose R. MCP

  • jueves, 24 de mayo de 2012 20:06
     
      Tiene código

    Cuando pulso en el botón de Descargar va a la función btnDownload_Click(object sender, EventArgs e), allí hago lo que me comentaste:
    this.Page.ClientScript.RegisterClientScriptBlock(..

    y registro el siguiente codigo javascript:

    <script type='text/javascript'>
    window.onload = function ()
    {

    window.location = 'C:\Temp\WebApplication4\WebApplication4\App_Data\Prueba.txt'};

    </script> 

    Pero no me deja descargarlo me salta una excepción.

    ¿Es así como me comentas que lo haga?

    PD: El DownloadFile(nombreFichero) es una funcion a la cual llamo desde el btnDescargar que contiene:.

                        try
                        {
                            //App_Data protege los ficheros de ser accesibles desde el navegador
                            filename = Request.MapPath(filename, "~/App_Data/fichero", false);
                            //Limpiamos la salida, limpia el buffer, lo vacía y se pierde su contenido
                            Response.Clear();
                            Response.ClearHeaders();
                            Response.ClearContent();
                            //Con esto le decimos al browser que la salida será descargable indicando el tipo de fichero a descargar
                            Response.ContentType = "application/octet-stream";
                            //esta linea es opcional, en donde podemos cambiar el nombre del fichero a descargar (para que sea diferente al original)
                            Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}", Path.GetFileName(filename)));
                            //Para transmitir archivos a un cliente.
                            Response.TransmitFile(filename);
                            //volcamos el stream
                            Response.Flush();
                        }
                        finally
                        {
                            //Eliminamos el archivo del servidor
                            File.Delete(filename);
                            // Método que detiene la ejecución de la página, la termina.
                            Response.End();
                        }

    Un saludo y perdona las molestias. Gracias por tu ayuda.

  • viernes, 25 de mayo de 2012 0:04
    Moderador
     
     
    La ubicación del archivo tiene que traducirse de C:\.... a http://dominio.com/....  Desde temp no puede descargarse directamente.  Necesita moverlo a un folder dentro de la aplicación web y traducir su ubicación a una ubicación http:// que el explorador del usuario entienda.

    Jose R. MCP

  • viernes, 25 de mayo de 2012 7:30
     
     

    Los ficheros los creaba en App_Data, pero desde ahí no me deja descargar los ficheros, he creado un directorio nuevo para guardar ahí los ficheros que genere, y he utilizado lo que me comentas ,ahora me abre la página con el fichero pero no me ejecuta la descarga. :(

    Un saludo.


  • viernes, 25 de mayo de 2012 14:24
    Moderador
     
     Respondida
    Sí, eso puede pasar cuando el explorador web es capaz de desplegar el contenido de la descarga.  O sea, cuando el tipo MIME es conocido, como texto o HTML.  Una búsqueda rápida da http://stackoverflow.com/questions/1238983/force-user-to-download-txt-php-file-txt, que dice que hay que agregar un encabezado para forzar la descarga.  Puede entonces crear un handler para archivos .txt.  Son bien fáciles de crear y usar.  Puede buscar ejemplos en la web.

    Jose R. MCP