none
Ayuda con PoregressBar de JQuery y ASP.Net RRS feed

  • Pregunta

  • Buenos días:

    Tengo un problema, no se que tan posible pueda ser, quiero mostrar un progressbar en webforms que se vaya actualizando el porcentaje de carga conforme recorre un datatable desde el lado del servidor (para ser mas exacto, recorro el datatable y armo un excel, pero cuando es data muy grande demora). Ya implemente el progressbar en jquery pero no se como actualizarlo desde asp.net webforms.

    gracias de antemano


    julio_1126

    lunes, 29 de septiembre de 2014 17:36

Respuestas

  • Tal como planteas tu pregunta, parece que estás pensando con mentalidad de aplicación de escritorio, y que no te das cuenta de cómo funciona la aplicación web. Con una página web normal (un fichero aspx), el usuario está viendo la página en el navegador y pulsa un botón, en cuyo evento Click llamas a ExportarExcel. En el momento en que se pulsa el botón, el navegador envía un "POST" al servidor, y la página queda parada, no se puede hacer nada en ella. La petición llega al servidor y se pone a ejecutar la rutina de exportación. Y cuando termina de ejecutarse, construye la respuesta y la envía al navegador, y entonces éste muestra el resultado. Mientras se está ejecutando la rutina de exportación, no hay una "conexión" entre el navegador y el servidor, el servidor no puede mostrar nada en pantalla.

    Entonces, ¿qué se hace? Se utiliza AJAX. Hay que escribir código javascript en el clic del botón en lado cliente, y bloquear el submit al servidor. Ese código javascript pinta el indicador de "procesando" y envía la petición al servidor mediante Ajax. Y cuando el javascript recibe la respuesta, entonces quita el mensaje de procesando y presenta la respuesta al usuario. Todo esto requiere código cliente en javascript, no se puede hacer tocando exclusivamente el código servidor.

    lunes, 29 de septiembre de 2014 19:29
  • No hay razón para que el método propiamente dicho deje de funcionar sólo porque lo llames mediante ajax. Lo que dejará de funcionar es la presentación de los resultados, es decir, el método mete directamente en el Response una cabecera de "Content-dis...", que solo funcionará para ofrecerle al usuario que descargue el fichero si se envía a la ventana del navegador, pero no hace nada si la pides mediante ajax (tendrías que ofrecer salvarlo desde el código cliente en javascript).

    Hay un truco que puedes usar: desde javascript, haz un window.open para que se abra una ventanita en el navegador. Y dentro de esa vantanita, llama a un .aspx que en su método Load llame a la exportación de Excel. De esta manera te ofrecerá descargar el resultado, y la propia existencia de la ventanita servirá como indicador de que se está a la espera de que ocurra algo (hará las veces de indicador de progreso).

    lunes, 29 de septiembre de 2014 19:58

Todas las respuestas

  • [...] implemente el progressbar en jquery pero no se como actualizarlo desde asp.net webforms.[...]

    No, un progressbar de jQuery (o de cualquier otro tipo en lado cliente) no se puede actualizar desde asp.net, solo se puede actualizar desde javascript.

    Esto significa que tu problema no tiene una solución sencilla. Tendrías que hacer llegar periódicamente desde el lado servidor al lado cliente el porcentaje de progreso que se ha alcanzado, con el fin de que el javascript cliente lo actualice en el progressbar. Esto se podría hacer mediante polling desde el cliente, usando un timer de javascript que llame periódicamente mediante ajax al servidor para consultar el progreso (lo cual es sencillo en el lado cliente pero complicado en el servidor porque esta petición llegaría a un thread distinto del que está recorriendo el datatable). O se podría hacer desde el servidor "inyectando" el progreso sobre el cliente mediante una librería tal como SignalR (que no es sencillo y tiene una empinada cuesta de aprendizaje). En cualquiera de los dos casos, te costará un buen montón de líneas de código y requiere amplios conocimientos de programación tanto en javascript como en el servidor.

    lunes, 29 de septiembre de 2014 18:08
  • Gracias Alberto por responder, en todo caso al menos mostrar el progressbar como indeterminado o una imagen y que cuando termine el proceso salga un mensaje o el progressbar se oculte. La idea es que indique al usuario que esta procesando los datos

    uso este código para generar el excel:

    Private Sub ExporttoExcel(ByVal table as datatable)


            HttpContext.Current.Response.Clear()

            HttpContext.Current.Response.ClearContent()

            HttpContext.Current.Response.ClearHeaders()

            HttpContext.Current.Response.Buffer = True

            HttpContext.Current.Response.ContentType = "application/ms-excel"

            HttpContext.Current.Response.Write("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">")

            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=Reports.xls")

            HttpContext.Current.Response.Charset = "utf-8"

            'HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250")

            'sets font

            HttpContext.Current.Response.Write("<font style='font-size:10.0pt; font-family:Calibri;'>")

            HttpContext.Current.Response.Write("<BR><BR><BR>")

            'sets the table border, cell spacing, border color, font of the text, background, foreground, font height

            HttpContext.Current.Response.Write("<Table border='1' bgColor='#ffffff' " + "borderColor='#000000' cellSpacing='0' cellPadding='0' " + "style='font-size:10.0pt; font-family:Calibri; background:white;'> <TR>")

            'am getting my grid's column headers

            For j As Integer = 0 To (table.Columns.Count - 1) Step 1

                'write in new column

                HttpContext.Current.Response.Write("<Td>")

                'Get column headers  and make it as bold in excel columns

                HttpContext.Current.Response.Write("<B>")

                HttpContext.Current.Response.Write(table.Columns(j).ColumnName)

                HttpContext.Current.Response.Write("</B>")

                HttpContext.Current.Response.Write("</Td>")

            Next

            Dim X As Int32

            HttpContext.Current.Response.Write("</TR>")

            For Each row As DataRow In table.Rows

                'mostrar barra

                Dim valor As Decimal

                valor = (X / table.Rows.Count) * 100

                X = X + 1

                Dim strScript As String = "apa2(" + valor.ToString() + ");"

                Me.ClientScript.RegisterStartupScript(Me.GetType(), "eee", strScript, True)

                HttpContext.Current.Response.Write("<TR>")

                For i As Integer = 0 To (table.Columns.Count - 1) Step 1

                    HttpContext.Current.Response.Write("<Td>")

                    HttpContext.Current.Response.Write(row(i).ToString())

                    HttpContext.Current.Response.Write("</Td>")

                Next

                HttpContext.Current.Response.Write("</TR>")

            Next

            HttpContext.Current.Response.Write("</Table>")

            HttpContext.Current.Response.Write("</font>")

            HttpContext.Current.Response.Flush()

            HttpContext.Current.Response.Clear()

            HttpContext.Current.Response.End()

        End Sub

    la idea es que al terminar este proceso muestre algo que indique que ya termino y que también indique que esta procesándolo.

    Saludos


    julio_1126

    lunes, 29 de septiembre de 2014 18:56
  • Tal como planteas tu pregunta, parece que estás pensando con mentalidad de aplicación de escritorio, y que no te das cuenta de cómo funciona la aplicación web. Con una página web normal (un fichero aspx), el usuario está viendo la página en el navegador y pulsa un botón, en cuyo evento Click llamas a ExportarExcel. En el momento en que se pulsa el botón, el navegador envía un "POST" al servidor, y la página queda parada, no se puede hacer nada en ella. La petición llega al servidor y se pone a ejecutar la rutina de exportación. Y cuando termina de ejecutarse, construye la respuesta y la envía al navegador, y entonces éste muestra el resultado. Mientras se está ejecutando la rutina de exportación, no hay una "conexión" entre el navegador y el servidor, el servidor no puede mostrar nada en pantalla.

    Entonces, ¿qué se hace? Se utiliza AJAX. Hay que escribir código javascript en el clic del botón en lado cliente, y bloquear el submit al servidor. Ese código javascript pinta el indicador de "procesando" y envía la petición al servidor mediante Ajax. Y cuando el javascript recibe la respuesta, entonces quita el mensaje de procesando y presenta la respuesta al usuario. Todo esto requiere código cliente en javascript, no se puede hacer tocando exclusivamente el código servidor.

    lunes, 29 de septiembre de 2014 19:29

  • Lo que pasa es que he intentado hacerlo como dices, pero ese metodo ExporttoExcel deja de funcionar. Por eso subí el código por sea el caso

    Saludos



    julio_1126

    lunes, 29 de septiembre de 2014 19:43
  • No hay razón para que el método propiamente dicho deje de funcionar sólo porque lo llames mediante ajax. Lo que dejará de funcionar es la presentación de los resultados, es decir, el método mete directamente en el Response una cabecera de "Content-dis...", que solo funcionará para ofrecerle al usuario que descargue el fichero si se envía a la ventana del navegador, pero no hace nada si la pides mediante ajax (tendrías que ofrecer salvarlo desde el código cliente en javascript).

    Hay un truco que puedes usar: desde javascript, haz un window.open para que se abra una ventanita en el navegador. Y dentro de esa vantanita, llama a un .aspx que en su método Load llame a la exportación de Excel. De esta manera te ofrecerá descargar el resultado, y la propia existencia de la ventanita servirá como indicador de que se está a la espera de que ocurra algo (hará las veces de indicador de progreso).

    lunes, 29 de septiembre de 2014 19:58
  • Gracias por al sugerencia. voy a probar de esa forma

    Saludos


    julio_1126

    martes, 30 de septiembre de 2014 16:06