none
Barre de Progression Asp Mise ajour dans un updatePanel via Thread auxiliaire. RRS feed

  • Question

  • Bonjour à tous, 

    J'essaie depuis un moment maintenant de faire une barre de progression sur une page Asp.net en vain.

    la barre de progression est sensée afficher l’état d'avancement d'un traitement de grande envergure sur le serveur.

    Au cours de l'execution du traitement j'envoie le pourcentage d'avancement(que je calcule) dans une variable globale a laquelle accède le processus auxiliaire qui la récupère et met ajour la valeur de l'avancement de la barre de progression. La barre de progression se trouve dans un updatePanel avec updateMode=Conditional  qui a pour déclencheur un timer de 200ms de latence.

    Ça n'avait pas l'air de marcher donc

    j'ai fini par me résoudre à afficher le pourcentage d'avancement dans un label mais ça n'a pas l'air de marcher non plus.
    J'ai essaye de remplacer le label par un textbox dont l’événement textChanged déclenchait l'update du panel sans résultat.

    J'ai Vérifié que le processus modifiait bel et bien les valeurs du textBox, label et même de la progressBar.

    Quelqu'un peut-il m'aider? Merci d'avance.


    mardi 28 avril 2015 18:12

Réponses

  • Merci pour le lien, mais perso je prefere les thread.

    Voici ce que j'ai pu faire ( Il a quand meme fallu que je mette le traitement long(Celui dont il faut afficher la progression)dans un thread mais bon ca marche.

    Asp.net:

    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="pgb.aspx.vb" Inherits="PgbProject.pgb" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
            <div>
    
                <asp:Button ID="btnTraitementLong" runat="server" Text="Traitement Long" EnableTheming="True" />
                <asp:Timer ID="TimerProg" runat="server" Interval="400"></asp:Timer>
                <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                    <ContentTemplate>
                        <asp:Button ID="BtnStatut" runat="server" Text="Statut" />
                        <asp:Label ID="lblProg" runat="server" Text="Progress:"></asp:Label>
                        <div id="divProg" runat="server" style="width: 405px; border:thin red dashed; height: auto">
                            
                            <div id="done" style="display: inline-block; background-color: blue; color: white; margin:auto; width:20px; height: 30px">
                                <p>done</p>
                            </div>
                            <div id="left" style="display: inline-block; background-color: darkred; color: white; margin: auto; width:380px; height: 30px">
                                <p>left</p>
                            </div>
                        </div>
                    </ContentTemplate>
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="BtnStatut" EventName="Click" />
                        <asp:AsyncPostBackTrigger ControlID="TimerProg" EventName="Tick" />
                    </Triggers>
                </asp:UpdatePanel>
    
            </div>
        </form>
    </body>
    </html>
    


    CodeBehind:

    Imports System.Threading
    
    Public Class pgb
        Inherits System.Web.UI.Page
        Private statue As Integer = 0
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
        End Sub
    
        Protected Sub btnTraitementLong_Click(sender As Object, e As EventArgs) Handles btnTraitementLong.Click
            Dim Thread As Thread = New Thread(New ParameterizedThreadStart(AddressOf LongTask))
            Thread.Start("2")
            Session("State") = 2
        End Sub
        Private Sub LongTask(ByVal parameters As Object)
            Dim param As String = CType(parameters, String)
            Dim pas As Integer = CInt(param)
            While Session("State") < 100
                System.Threading.Thread.Sleep(1000)
                Session("State") += pas
                statue += pas
            End While
            Session("State") = 100
        End Sub
    
        Protected Sub BtnStatut_Click(sender As Object, e As EventArgs) Handles BtnStatut.Click
            Dim i As Object = Session("State")
            divProg.InnerHtml = "<div id=""done"" style=""display: inline-block; background-color: blue; color: white; margin:auto; width:" & i * 4 & "px; height: 30px"">" + _
                               "<p>done</p>" + _
                           "</div>" + _
                           "<div id=""left"" style=""display: inline-block; background-color: darkred; color: white; margin: auto; width:" & 400 - i * 4 & "px; height: 30px"">" + _
                               "<p>left</p>" + _
                           "</div> "
        End Sub
    
        Protected Sub TimerProg_Tick(sender As Object, e As EventArgs) Handles TimerProg.Tick
            lblProg.Text = "Progress: " & Session("State")
            Dim i As Object = Session("State")
            divProg.InnerHtml = "<div id=""done"" style=""display: inline-block; background-color: blue; color: white; margin:auto; width:" & i * 4 & "px; height: 30px"">" + _
                               "<p>done</p>" + _
                           "</div>" + _
                           "<div id=""left"" style=""display: inline-block; background-color: darkred; color: white; margin: auto; width:" & 400 - i * 4 & "px; height: 30px"">" + _
                               "<p>left</p>" + _
                           "</div> "
        End Sub
    End Class

    C'est pas tout à fait ça mais c'est deja un debut.

    Merci

    • Marqué comme réponse Princinho samedi 2 mai 2015 17:43
    samedi 2 mai 2015 17:42

Toutes les réponses

  • Bonjour, Princinho,

    Dans le lien suivant l’exemple recourt au BackgroundWorker mais il concerne WinForms:
    Winforms Progress bar Does Not Update (C#)

    Autant qu’il s’agisse d’ASP.net, pourriez-vous essayer d’implémenter l’espace de noms System.Threading au lieu du BackgroundWorker?

    Vouci un exemple: http://forums.asp.net/t/1141831.aspx

    Merci de nous tenir au courant.

    Cordialement,
    Dimitar

    mercredi 29 avril 2015 14:54
    Modérateur
  • Merci pour le lien, mais perso je prefere les thread.

    Voici ce que j'ai pu faire ( Il a quand meme fallu que je mette le traitement long(Celui dont il faut afficher la progression)dans un thread mais bon ca marche.

    Asp.net:

    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="pgb.aspx.vb" Inherits="PgbProject.pgb" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
            <div>
    
                <asp:Button ID="btnTraitementLong" runat="server" Text="Traitement Long" EnableTheming="True" />
                <asp:Timer ID="TimerProg" runat="server" Interval="400"></asp:Timer>
                <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                    <ContentTemplate>
                        <asp:Button ID="BtnStatut" runat="server" Text="Statut" />
                        <asp:Label ID="lblProg" runat="server" Text="Progress:"></asp:Label>
                        <div id="divProg" runat="server" style="width: 405px; border:thin red dashed; height: auto">
                            
                            <div id="done" style="display: inline-block; background-color: blue; color: white; margin:auto; width:20px; height: 30px">
                                <p>done</p>
                            </div>
                            <div id="left" style="display: inline-block; background-color: darkred; color: white; margin: auto; width:380px; height: 30px">
                                <p>left</p>
                            </div>
                        </div>
                    </ContentTemplate>
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="BtnStatut" EventName="Click" />
                        <asp:AsyncPostBackTrigger ControlID="TimerProg" EventName="Tick" />
                    </Triggers>
                </asp:UpdatePanel>
    
            </div>
        </form>
    </body>
    </html>
    


    CodeBehind:

    Imports System.Threading
    
    Public Class pgb
        Inherits System.Web.UI.Page
        Private statue As Integer = 0
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
        End Sub
    
        Protected Sub btnTraitementLong_Click(sender As Object, e As EventArgs) Handles btnTraitementLong.Click
            Dim Thread As Thread = New Thread(New ParameterizedThreadStart(AddressOf LongTask))
            Thread.Start("2")
            Session("State") = 2
        End Sub
        Private Sub LongTask(ByVal parameters As Object)
            Dim param As String = CType(parameters, String)
            Dim pas As Integer = CInt(param)
            While Session("State") < 100
                System.Threading.Thread.Sleep(1000)
                Session("State") += pas
                statue += pas
            End While
            Session("State") = 100
        End Sub
    
        Protected Sub BtnStatut_Click(sender As Object, e As EventArgs) Handles BtnStatut.Click
            Dim i As Object = Session("State")
            divProg.InnerHtml = "<div id=""done"" style=""display: inline-block; background-color: blue; color: white; margin:auto; width:" & i * 4 & "px; height: 30px"">" + _
                               "<p>done</p>" + _
                           "</div>" + _
                           "<div id=""left"" style=""display: inline-block; background-color: darkred; color: white; margin: auto; width:" & 400 - i * 4 & "px; height: 30px"">" + _
                               "<p>left</p>" + _
                           "</div> "
        End Sub
    
        Protected Sub TimerProg_Tick(sender As Object, e As EventArgs) Handles TimerProg.Tick
            lblProg.Text = "Progress: " & Session("State")
            Dim i As Object = Session("State")
            divProg.InnerHtml = "<div id=""done"" style=""display: inline-block; background-color: blue; color: white; margin:auto; width:" & i * 4 & "px; height: 30px"">" + _
                               "<p>done</p>" + _
                           "</div>" + _
                           "<div id=""left"" style=""display: inline-block; background-color: darkred; color: white; margin: auto; width:" & 400 - i * 4 & "px; height: 30px"">" + _
                               "<p>left</p>" + _
                           "</div> "
        End Sub
    End Class

    C'est pas tout à fait ça mais c'est deja un debut.

    Merci

    • Marqué comme réponse Princinho samedi 2 mai 2015 17:43
    samedi 2 mai 2015 17:42