2009-04-28 8 views
5

Mam funkcję importowania arkusza kalkulacyjnego programu Excel w aplikacji. Używa w tej chwili kontroli FileUpload. Przesyłam plik, a następnie uruchamiam operację na tym pliku. Chcę poinformować użytkownika o operacji, która została wykonana, oraz o procentowej wartości wykonanej operacji. Myślę, że mogę pobrać całkowitą liczbę wierszy, które wyodrębniłem z arkusza kalkulacyjnego programu Excel, i ciągle dzielić, gdy wstawiam każdy rekord do bazy danych i aktualizuję pasek postępu.Pasek postępu ASP.NET AJAX: Aktualizacja z kodu z tyłu?

Problem polega na tym, że nie mogę znaleźć rozwiązania, które aktualizuje pasek postępu z kodu Behind. Próbowałem użyć Matt Berseth's solution.

Bardzo miło jest spojrzeć na to, ale nie widzę, żeby działało z Kodeksu Behind. Teoretycznie doszedłem do wniosku, że umieszczenie wartości w polu tekstowym na stronie i ustawienie funkcji onchange na funkcję JavaScript w celu ustawienia wartości procentowej będzie działało jako test, ale nawet to nie przyniosło pożądanych rezultatów.

Jakieś sugestie, jak to zrobić?

Odpowiedz

1

Powinieneś wiedzieć, że nie możesz sprawdzić stanu przesyłania pliku za pomocą standardowego kontrolki FileUpload. Możesz przesłać plik na serwer, a następnie połączyć się z nim za pomocą ODBC i rozpocząć odczytywanie i wstawianie linii w bazie danych asynchronicznie (przez wykonanie żądania ajax do strony lub za pomocą usługi skryptowej).

Jeśli chodzi o pasek postępu, powinieneś po prostu użyć paska postępu CSS (prosty przykład można znaleźć pod adresem: http://css-tricks.com/examples/ProgressBars/).

Następnie należy zbudować obsługę skryptów (przy użyciu serivice internetową) z metody, która może powrócić stan postępu z serwera:

* .asmx Twój plik powinien zawierać coś takiego:

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

Twoja strona aspx powinien zawierać coś takiego:

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

Następnie powinieneś być w stanie wywołać tę metodę z JavaScript okresowo (każda sekunda dla examp le, przy użyciu setTimeout) i zaktualizować szerokości pasek postępu z prostego JavaScript lub jQuery:

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()); 
} 

Można rozszerzyć swoją funkcję onSuccess JavaScript i gdy postęp jest kompletne (zwracana wartość to 100%) można przekierować użytkownika do inną stronę lub wyświetl informacje lub przycisk w zależności od potrzeb.

Mam nadzieję, że to pomoże!