ASP.NET Lancer tache asynchrone pendant refresh d'updatepanel

ASP.NET Lancer tache asynchrone pendant refresh d'updatepanel - ASP - Programmation

Marsh Posté le 26-06-2013 à 15:47:14    

Salut à tous,
 
J'ai créé un UserControl.
A l'intérieur j'y ai mis un updatepanel, un bouton et un objectdatasource.
Dans l'updatepanel j'ai mis un timer et une gridview.
Ce que j'aimerais que mon code fasse :
1-l'updatepanel rafraichit la gridview toutes les 2 secondes.
2-Lorsque le bouton est cliqué je voudrais qu'une tache asynchrone soit lancée pendant que la gridview continue de se rafraichir.
 
Voilà mon code :

Code :
  1. <%@ Control Language="VB" AutoEventWireup="false" CodeFile="ctrAM.ascx.vb"
  2. Inherits="App_Controls_ctrAM" %>
  3. <style type="text/css">
  4.     `.hiddencol
  5.     {
  6.         display: none;
  7.      }`
  8. </style>
  9. <asp:ScriptManager ID="ScriptManager1" runat="server">
  10. </asp:ScriptManager>
  11. <asp:UpdatePanel ID="UpdatePanel1" runat="server">
  12. <contenttemplate>
  13. <asp:Timer ID="Timer1" runat="server"  Interval="2000" OnTick="Timer1_Tick">
  14.     </asp:Timer>
  15.         <asp:GridView ID="ImportProgress" runat="server" AutoGenerateColumns="False"
  16.             Width="530px" Height="50px" CellPadding="3" Font-Size="X-Small"
  17.             Font-Names="Arial" BorderColor="White" PagerStyle-Mode="NumericPages"
  18.         DataSourceID="ObjectDataSource1">
  19.             <Columns>
  20.                 <asp:BoundField DataField="TAPL_L" HeaderText="Process" ItemStyle-Width="200px">
  21.                 </asp:BoundField>
  22.                 <asp:BoundField DataField="TAPL_D" HeaderText="Description"  ItemStyle-Width="300">
  23.                 </asp:BoundField>
  24.                 <asp:BoundField DataField="TAPL_ExecutionOrder" HeaderText="Exec"  ItemStyle-Width="5px">
  25.                 </asp:BoundField>
  26.                 <asp:TemplateField HeaderText="Progress" ItemStyle-Width="25px">
  27.                     <ItemTemplate>
  28.                         <img src='<%# GetIconImagePath(container.dataItem("TAPS_S" )) %>' width=20 />
  29.                     </ItemTemplate>
  30.                 </asp:TemplateField>
  31.                 <asp:BoundField HeaderText="hdnProgress" DataField="TAPS_S" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" >
  32.                 </asp:BoundField>
  33.             </Columns>
  34.             <headerstyle font-bold="True" forecolor="White" backcolor="#D7B191">        </headerstyle>
  35.             <pagerstyle font-bold="True" horizontalalign="Right" forecolor="White" backcolor="#D7B191">
  36.         </pagerstyle>
  37.         </asp:GridView>
  38.         </contenttemplate>
  39. </asp:UpdatePanel>
  40. <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select"
  41. TypeName="clsTAPS">
  42. <SelectParameters>
  43.     <asp:Parameter Name="sSessionId" Type="String" DefaultValue="a11" />
  44. </SelectParameters>   
  45. </asp:ObjectDataSource>
  46. <asp:Button ID="Button1" runat="server" Text="Button" autopostback="true" />


 
Et la partie VB :
 

Code :
  1. Imports System.Data
  2. Imports System.Data.SqlClient
  3. Imports System.Data.SqlTypes
  4. Imports System.Threading
  5. Imports System.Globalization
  6. Partial Class App_Controls_ctrAM
  7. Inherits System.Web.UI.UserControl
  8. Sub Page_Load(Sender As Object, E As EventArgs) Handles Me.Load
  9.     If Not Page.IsPostBack Then
  10.     Else
  11.         ImportProgress.DataBind()
  12.     End If
  13. End Sub
  14. Function GetIconImagePath(ByVal strProgress As String) As String
  15.     Select Case Trim(strProgress)
  16.         Case "Unstarted"
  17.             Return "../../images/Imports/unstarted.png"
  18.     End Select
  19. End Function
  20. Function LoadDataValidations(ByVal sSessionId As String)
  21.     Dim oAsyncTask As New clsImportAsync()
  22.     oAsyncTask.sTAPS_SessionId = sSessionId
  23.     Dim asyncTask As New PageAsyncTask(AddressOf oAsyncTask.OnBegin, AddressOf oAsyncTask.OnEnd, AddressOf oAsyncTask.OnTimeout, "AsyncTask", True)
  24.     ' Register the asynchronous task.
  25.     Page.RegisterAsyncTask(asyncTask)
  26.     ' Execute the register asynchronous task.
  27.     Page.ExecuteRegisteredAsyncTasks()
  28.     ' Display the results of the export
  29.     ShowResults()
  30. End Function
  31. Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
  32.     Label1.Text = "Panel refreshed at: " + DateTime.Now.ToLongTimeString()
  33.     Try
  34.         ImportProgress.DataBind()
  35.         Next
  36.     Catch ex As Exception
  37.         Label1.Text = "==" + ex.ToString
  38.     End Try
  39. End Sub
  40. Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
  41.         LoadDataValidations(hndAPSessionID.Text)
  42. End Sub
  43. End Class


 
Mon problème :
 
Dès que je clique sur le bouton la page freeze.
Comme si le timer était bloqué.
Tout reprend lorsque la tache asynchrone est terminée et alors la gridview se rafraichit.
J'ai essayé avec un second updatepanel (contenant le bouton), avec un timer javascript ça ne fonctionne jamais.
Que fais je de mal ?
Merci de votre aide.

Reply

Marsh Posté le 26-06-2013 à 15:47:14   

Reply

Marsh Posté le 27-06-2013 à 10:38:31    

Ce qui se passe, je pense, c'est que ton bouton se comporte comme un formulaire classique, c'est à dire que quand tu clic dessus, c'est la page tout entière qui est rechargée.
 
Une solution serait peut-être de passer par l'updatepanel. Essaye dans un premier temps de simplement déplacer ton bouton à l'intérieur de l'updatepanel.
 
Si ca fonctionne et que tu veux garder le bouton à l'extérieur du panel, il y a une config un peu spécifique à mettre en place. De mémoire, passer le champ UpdateMode de l'UpdatePanel à Conditionnal, et ajouter les évènements (triggers) qui vont s'effectuer en asynchrone à la main (le tick du timer et le clic du bouton à priori)


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
Reply

Marsh Posté le 01-07-2013 à 10:36:01    

Merci pour cette réponse x1fr.
J'ai placé mon button à cet endroit :
 

Code :
  1. </pagerstyle>
  2.             </asp:GridView>
  3.               <asp:Button ID="Button1" runat="server" Text="Button" />
  4.             </contenttemplate>
  5. </asp:UpdatePanel>


 
J'ai enlevé l'attribut autopostback.
 
Ce qu'il se passe maintenant :
-au chargement de la page il y a bien une réactualisation toutes les deux secondes de ma gridview
-quand je clique sur le bouton, le compteur se frise
-au bout d'un certain temps (je suppose la durée de la tache lancée par le bouton) la gridview se met à jour et le timer est bloqué, il ne tick plus.

Reply

Marsh Posté le 03-07-2013 à 12:16:49    

Non ça ne vous dit rien ?

Reply

Marsh Posté le 03-07-2013 à 18:06:07    

Nan désolé, j'ai manipulé des updatepanels il y a quelques temps et j'avais eu des soucis aussi avec les évenements qui déclenchent les appels asynchrones un peu comme ça, maintenant que le bouton est dans le panel, je ne vois pas trop pourquoi le timer s'arrete


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
Reply

Marsh Posté le 31-07-2013 à 10:47:37    

Bon merci quand même...
Si quelqu'un d'autre a une idée...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed