2011-07-20 8 views
1

私は困惑しています。私はサイトがクエリを実行している間に進行状況バーを表示しようとしています。クエリーには4〜6分かかります。私の進行状況バーはその値をデータベースから取得し、Oracleは進捗バーに値を提供する組み込みのクエリを持っています。私はEssentialObjects' ProgressBarを使用しています。基本的に私はちょうどここで1から100非同期ポストバック中にページを更新するにはどうすればよいですか?

間の整数に "価値" を設定し、私のコードの簡易版である:

ページ:

<asp:UpdatePanel ID="upQuery" runat="server"> 
    <ContentTemplate> 
     <asp:Button ID="btnExecute" runat="server" OnClick="btnExecute_Click" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 
<asp:UpdatePanel ID="upProgress" runat="server"> 
    <ContentTemplate> 
     <asp:Timer ID="tmr" runat="server" Enabled="false" 
        OnTick="tmr_Tick" Interval="3000"></asp:Timer> 
     <eo:ProgressBar ID="pbr" runat="server" ></eo:ProgressBar> 
    </ContentTemplate> 
</asp:UpdatePanel> 

コード:

protected void btnExecute_Click(object sender, EventArgs e) { 
     tmr.Enabled = true; 
     ExecuteLongQuery(); 
} 

protected void tmr_Tick(object sender, EventArgs e) { 
     pbr.Value = GetProgress(); 
} 

基本的には、btnExecuteをクリックすると、ポストバックが完了するまでタイマーが開始されず、プログレスバーは表示されません。私はコールバックを試みました、私はそれを正しかったかどうかはわかりませんが、ページはポストバック中に結果を表示しませんでした。ページが非同期のポストバック中に応答するタイマー(または何か)を取得するにはどうすればよいですか?

+1

スレッドやその他のコードに関する詳細情報を提供する必要があります。考え方は、クエリ/クラスのProgressChangedイベントを購読するか、クラス内でユーザーインターフェイスを呼び出すことですが、両方の方法で、より多くのコードを参照する必要があります。 –

+0

これはウェブページであり、Windowsフォームではありません。私はカスタムコントロールを使用しているため、ProgressChangedイベントはありません。私は何を供給する必要があるか分かりません。 – tedski

+1

ExecuteLongQuery()のコードは役に立ちます... –

答えて

3

タイマーを有効にしたという事実は、ポストバックが完了するまでクライアントに渡されません。それはちょうどそれが動作する方法です。サーバー上でコードを実行しても、クライアントに直接影響はありません。クライアントに応答を送信する前にExecuteLongQuery()が完了するのを待っている場合は、タイマーが表示されません。

おそらくExecuteLongQuery()をサーバー上の別のスレッドで実行して、ポストバックが完了してタイマーを開始できるようにすることをお勧めします。

私はASP.Netページのライフサイクルを読むことをお勧めします。thisは良い場所のようです。

+0

私はUpdatePanelを使用すると別のスレッドを開始するという印象にあったと思いますが、それは簡単ではないと思います。私はスレッドを調べます。あなたが知っている良いチュートリアルはありますか? – tedski

+0

ああ、いいえ。 UpdatePanelは、ページの一部だけをリロードするポストバックを行います。イベントハンドラ内のすべてのコードが実行を終了するまで、クライアントには戻りません。 .NETのスレッディングに関する経験はありませんが、ASP.Netがサポートするワーカースレッドを使用する必要があると思います。あなたは簡単にチュートリアルを見つけることができるはずです。がんばろう! :) –

+0

うわー、それは本当に簡単でした。私はちょうど[this](http://www.sitepoint.com/threading-asp-net/)チュートリアルを使用しました。ありがとう! – tedski

5

私はこれを見つけ、それは私のために働く。必要に応じて変更することができます。これはすべてのページのポストバックに対して機能し、制限したい場合は、要件のコードを変更します。

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head id="Head1" runat="server"> 
     <title></title> 
     <style type="text/css"> 
      .modalPopup 
      { 
       background-color: #696969; 
       filter: alpha(opacity=40); 
       opacity: 0.7; 
       xindex: -1; 
      } 
     </style> 
    </head> 
    <body> 
     <form id="form2" runat="server"> 
       <asp:ScriptManager ID="ScriptManager2" runat="server" /> 
       <script type="text/javascript"> 
        var prm = Sys.WebForms.PageRequestManager.getInstance(); 
        //Raised before processing of an asynchronous postback starts and the postback request is sent to the server. 
        prm.add_beginRequest(BeginRequestHandler); 
        // Raised after an asynchronous postback is finished and control has been returned to the browser. 
        prm.add_endRequest(EndRequestHandler); 
        function BeginRequestHandler(sender, args) 
        { 
         //Shows the modal popup - the update progress 
         var popup = $find('<%= modalPopup.ClientID %>'); 
         if (popup != null) 
         { 
          popup.show(); 
         } 
        } 

        function EndRequestHandler(sender, args) 
        { 
         //Hide the modal popup - the update progress 
         var popup = $find('<%= modalPopup.ClientID %>'); 
         if (popup != null) 
         { 
          popup.hide(); 
         } 
        } 
       </script> 
       <div> 
        <asp:UpdateProgress ID="UpdateProgress1" runat="server"> 
         <ProgressTemplate> 
          <asp:Image ID="Image1" ImageUrl="waiting.gif" AlternateText="Processing" runat="server" /> 
         </ProgressTemplate> 
        </asp:UpdateProgress> 
        <ajaxtoolkit:modalpopupextender id="modalPopup" runat="server" targetcontrolid="UpdateProgress" popupcontrolid="UpdateProgress" backgroundcssclass="modalPopup" /> 
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
         <ContentTemplate> 
          <asp:Button ID="Button1" runat="server" Text="Submit" OnClick="btnSubmit_Click" /> 
         </ContentTemplate> 
        </asp:UpdatePanel> 
      </div> 
     </form> 
    </body> 
</html> 
関連する問題