2009-05-26 57 views
2

我使用Visual Studio 2008中,有一個頁面看起來像這樣(的東西剪斷)ASP.NET 3.5:的Page_Load()中顯示的UpdateProgress

<asp:Content ID="Content2" ContentPlaceHolderID="PageContentPlaceHolder" runat="server"> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
      the page here.. 
     </ContentTemplate> 
    </asp:UpdatePanel> 
    <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="100"> 
     <ProgressTemplate> 
      <div> 
       <asp:Image ID="AjaxImage" runat="server" ImageUrl="Ajax.gif" /> 
      </div> 
     </ProgressTemplate> 
    </asp:UpdateProgress> 
</asp:Content> 

在Page_Load開始長(構建ASP.NET網站> 5s)過程

protected void Page_Load(object sender, EventArgs e) 
{    
    if (!IsPostBack)    
    { 
    LongRunningProcess();     
    } 
} 

如何在LongRunningProcess正在運行時顯示UpdateProgress?當我將LongRunningProcess()調用移動到按鈕onclick處理程序時,它可以工作。

回答

2

創建一個正常的div顯示Ajax.gif所以它顯示「處理」默認情況下。

在javascript pageLoad()函數中,使用Ajax的PageMethods進行回調。

function pageLoad(sender, args) { 
       PageMethods.getVersions(LoadVersionsCallback); 
    } 

你在.aspx.cs文件調用的方法必須是靜態的,它可以帶參數,看起來是這樣的:

[System.Web.Services.WebMethod] 
    public static string getVersions() 
    { 
     StringBuilder sb = new StringBuilder(); 
     ... etc. 
     return sb.ToString(); 

    } 

您在調用指定的JavaScript函數方法將在方法完成時運行。它會通過結果。在這個函數的最後,你隱藏了Ajax.gif div。

function LoadVersionsCallback(result) { 
    // do something with the results - I load a dropdown list box. 

    ...etc. 
    // here is where you hide your div holding the Ajax.gif 

    } 

然後你在做什麼是你在不到1秒做運行工作....

+0

嗨@JBrooks,我有同樣的問題,並試圖理解你的解決方案。我用加載圖像創建了div。阿洛斯有Javascript頁面加載方法,現在我想知道在getVersions和** LoadVersionsCallback **中寫什麼?我正在使用框架4.0,這個解決方案在4.0中也有用嗎? – user1181942 2012-04-02 07:27:14

2

我會在頁面上放置一個Ajax計時器,並將其設置爲不到一秒鐘......它只會運行一次,並且在第一次打勾後需要禁用它,否則會再次觸發。 (你不想一次開始你的長時間運行過程......)

然後OnTimerTick事件我會開始你的長時間運行的過程,你的頁面完全呈現,你可以顯示你的UpdateProgress而它的運行。

你出去可以移動,你有你的點擊按鈕的時間計時碼...

+0

我會試試這個,謝謝 – edosoft 2009-05-29 07:46:17

1

我用上面JBrooks理念(即表示進度指示器作爲面板的一部分還包括Iframe,以便在Iframe首次加載之前顯示),但簡化了它:設置iframe的樣式,以便當它出現時,它位於動畫GIF的頂部。

不需要Javascript或C#代碼隱藏。

下面是相關的ASPX,其次是CSS。您必須在樣式中選擇「頂部」設置以覆蓋您使用的圖像。

  <asp:Panel ID="DetailPanel" runat="server" CssClass="submitBox detailPanel"> 
       <asp:Table ID="Table1" runat="server" Width="100%"> 
        <asp:TableHeaderRow ID="TableHeaderRow10" runat="server"> 
         <asp:TableCell ID="TableHeaderCell" runat="server" 
          Font-Bold="true" HorizontalAlign="Center"> 
         Title Text 
         </asp:TableCell> 
        </asp:TableHeaderRow> 
        <asp:TableRow> 
         <asp:TableCell HorizontalAlign="Center"> 
          <asp:Image ID="Image1" runat="server" ImageUrl="~/Images/animated_progress.gif" /> 
         </asp:TableCell> 
        </asp:TableRow> 
       </asp:Table> 
       <div class="iframeOverlay"> 
        <iframe id="IframeDetail" runat="server" style="width: 100%; height: 100%;" /> 
       </div> 
      </asp:Panel> 

.iframeOverlay { z索引:2; 位置:相對; top:-50px; }

3
  1. 將您的page_load代碼移動到一個新函數中。
  2. 將AJAX計時器添加到頁面的ContentTemplate部分。將間隔設置爲500。(1/2秒)
  3. 雙擊設計視圖中的Timer對象以創建_tick處理程序。
  4. 在上一步中創建的_tick處理器,調用下面的代碼

    protected void My_Timer_Tick(object sender, EventArgs e) 
    { 
        My_Timer_Name.Enabled = false; 
        My_Page_Load_Function(); // Function created in step 1 above) 
    } 
    
    protected void My_Page_Load_Function() 
    { 
        System.Threading.Thread.Sleep(5000); // A delay to simulate doing something. 
        lblMyLabel.Text = "Done!"; // Write output to page. 
    } 
    
0

使用jQuery。

<script> 
$(document).ready(function() { 
$('#<%= UpdateProgress1.ClientID %>').show(); 
}); 
</script> 
0
<script> $(document).ready(function() { $('#<%= 
UpdateProgress1.ClientID %>').show(); }); </script> 

這個工作很適合我,剛將它添加到身體部分的結束和工作就像一個魅力。