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:50Moderador
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:59Moderador
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
¿Como puedo llamar desde el javascript a la funcion c# para descargar el fichero?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
-
martes, 22 de mayo de 2012 19:15ModeradorNo 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:31ModeradorSí: 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:15ModeradorDespué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
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:04ModeradorLa 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:24Moderador
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
- Marcado como respuesta Eder CostaModerator lunes, 28 de mayo de 2012 17:24

