Bonjour,
Pour placer le contexte, j'ai une petite interface avec 2 paramètres à choisir puis un bouton qui va lancer le traitements des données que j'enregistre dans une base SQL server. Puis à la fin du traitement, je transfert des données de la base SQL via une requête incluant les paramètres dans une datatable, que j'exporte vers le client sous Excel via cette méthode:
Pendant le traitement des données, j'affiche un petit élément dynamique javascript (type gif animé) que je lance via l'évènement "OnClientClick" de cette manière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 private void ExporttoExcel(DataTable table) { 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=detail.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:11.0pt; font-family:Calibri;'> <TR>"); //am getting my grid's column headers int columnscount = table.Columns.Count; for (int j = 0; j < columnscount; j++) { //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].Caption); HttpContext.Current.Response.Write("</B>"); HttpContext.Current.Response.Write("</Td>"); } HttpContext.Current.Response.Write("</TR>"); foreach (DataRow row in table.Rows) {//write in new row HttpContext.Current.Response.Write("<TR>"); for (int i = 0; i < table.Columns.Count; i++) { HttpContext.Current.Response.Write("<Td>"); HttpContext.Current.Response.Write(row[i].ToString()); HttpContext.Current.Response.Write("</Td>"); } HttpContext.Current.Response.Write("</TR>"); } HttpContext.Current.Response.Write("</Table>"); HttpContext.Current.Response.Write("</font>"); try { HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } catch(Exception e) { string msg = e.Message; HttpContext.Current.Response.End(); } }
J'ai mon bouton dans une div nommé id="lebouton" et mon élément indiquant le traitement en cours dans une div nommé id="patienter". Voici mes 2 fonctions en javascript:
Code : Sélectionner tout - Visualiser dans une fenêtre à part <asp:Button ID="btnCalculer" runat="server" Text="Calculer" Width="122px" OnClick="btnCalculer_Click" OnClientClick="javascript:showWait();" />
Le téléchargement du fichier Excel se fait très bien pas de problème et mon élément dynamique s'affiche parfaitement bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 <script lang="javascript" type="text/javascript"> function showWait() { var opts = { lines: 11, // The number of lines to draw length: 5, // The length of each line width: 3, // The line thickness radius: 7, // The radius of the inner circle corners: 1, // Corner roundness (0..1) rotate: 12, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#000', // #rgb or #rrggbb or array of colors speed: 1, // Rounds per second trail: 60, // Afterglow percentage shadow: false, // Whether to render a shadow hwaccel: false, // Whether to use hardware acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: 2, // Top position relative to parent in px left: 5 // Left position relative to parent in px }; var target = document.getElementById('patienter'); var spinner = new Spinner(opts).spin(target); target.style.display = ''; document.getElementById('lebouton').style.display = 'none'; } function showBtn() { var target = document.getElementById('patienter'); target.style.display = 'none'; document.getElementById('lebouton').style.display = ''; } </script>
Mon problème est qu'à la fin de l'export du fichier Excel, je n'arrive pas à cacher ma div "patienter" et afficher ma div "lebouton". D'après ce que j'ai pu lire, c'est à cause de la fonction "HttpContext.Current.Response.End();" mais je ne vois pas du tout comment contourner ça...
Ce que j'ai déjà essayé:
- ce code avant ou après l'export- avant le End()
Code : Sélectionner tout - Visualiser dans une fenêtre à part Page.ClientScript.RegisterStartupScript(Page.GetType(), "showBtn", "<script language='javascript'> showBtn(); </script>");- remplacer Response.End() par Response.Close() et HttpContext.Current.ApplicationInstance.CompleteRequest();
Code : Sélectionner tout - Visualiser dans une fenêtre à part Response.Write("<script language='javascript'> showBtn(); </script>");
Donc en gros après la fonction Response.End() je ne sais pas comment reprendre la main pour soit réafficher ou ma div ou même actualiser la page...
Quelqu'un pour m'orienter?
Partager