2009-04-28 9 views
5

J'ai une fonction Importer pour une feuille de calcul Excel dans une application. Il utilise le contrôle FileUpload pour le moment. Je télécharge le fichier, puis exécute une opération sur ce fichier. Je veux informer l'utilisateur de l'opération en cours et du pourcentage qui est fait. Je suppose que je peux prendre le nombre total de lignes que j'ai extraites de la feuille de calcul Excel et diviser continuellement en insérant chaque enregistrement dans la base de données et mettre à jour une barre de progression.Barre de progression ASP.NET AJAX: mise à jour du code derrière?

Le problème est que je n'arrive pas à trouver de solution qui met à jour une barre de progression du Code Behind. J'ai essayé d'utiliser Matt Berseth's solution.

C'est très agréable à regarder, mais je ne vois pas comment le faire fonctionner à partir du Code Behind. Théoriquement, je me suis dit que mettre une valeur dans une zone de texte sur la page, et mettre onchange à une fonction JavaScript pour définir le pourcentage fonctionnerait comme un test, mais même cela ne m'a pas donné les résultats souhaités.

Des suggestions sur la façon dont cela peut être fait?

Répondre

1

Ce que vous devez savoir, c'est que vous ne pouvez pas vérifier l'état d'un téléchargement de fichier à l'aide du contrôle FileUpload standard. Ce que vous pouvez faire est de télécharger le fichier sur le serveur, puis de vous connecter en utilisant ODBC et commencer à lire et insérer des lignes dans votre base de données asynchrone (en faisant une requête ajax à une page ou en utilisant un service de script).

En ce qui concerne la barre de progression, vous devez simplement utiliser une barre de progression CSS (vous pouvez trouver un exemple simple à: http://css-tricks.com/examples/ProgressBars/).

Ensuite, vous devez créer un service de script (en utilisant un serivice web) avec une méthode qui peut renvoyer l'état de vos progrès à partir du serveur:

Votre fichier * .asmx doit contenir quelque chose comme:

[WebMethod] 
public int GetStatus() 
    { 
     int progress = 0; // in percents 
     // your server-side code here 
     return progress; 
    } 

Votre page ASPX doit contenir quelque chose comme:

<asp:ScriptManager runat="server" ID="ScriptManager"> 
<Services> 
    <asp:ServiceReference Path="~/services/import.asmx" InlineScript="false" /> 
</Services> 
</asp:ScriptManager> 

Ensuite, vous devriez être en mesure d'appeler cette méthode à partir de JavaScript périodiquement (chaque seconde tro le, en utilisant setTimeout) et mettre à jour la largeur de barre de progression avec JavaScript ou jQuery simple:

var tout, service; 

function UpdateStatus() { 
    if (tout != null) 
     clearTimeout(tout); 

    if (service == null) 
     service = new namespace.here.serice_class_here(); 

    service.GetStatus(onSuccess, onFailure);  
} 

function onSuccess(result) { 
    // update the width of the progress with result (the integer value of the progress) 
    progress_bar.style.width = percent + "%";   

    // call the method again 
    tout = setTimeout("UpdateStatus()", 1000); 
} 

function onFailure(error) { 
    alert(error.get_message()); 
} 

Vous pouvez étendre votre fonction onSuccess JavaScript et quand la progression est terminée (valeur retournée est 100%), vous pouvez rediriger l'utilisateur vers une autre page ou afficher une info ou un bouton en fonction de vos besoins.

J'espère que cela aide!

Questions connexes