2010-01-07 57 views
1

這很容易,但讓我難住。在一個功能中多次更新屏幕元素

如何在一個函數中多次更改屏幕上的元素?

我想在我的函數開始處更改標籤以讀取類似「starting ...」的內容,然後離開並執行一些操作,然後在最後將標籤更改爲「已完成」。

作爲一個例子,爲什麼下面的代碼:

 errorMessage.Text = "Three..."; 
     System.Threading.Thread.Sleep(1000); 
     errorMessage.Text = "Two..."; 
     System.Threading.Thread.Sleep(1000); 
     errorMessage.Text = "One..."; 
     System.Threading.Thread.Sleep(1000); 
     errorMessage.Text = "Go!"; 
     System.Threading.Thread.Sleep(1000); 

只是暫停4秒鐘,然後更改標籤文本,以「走!」而不是倒計時?

TIA

回答

2

您的代碼只更新一次屏幕的原因是它在單個回發內部運行。在回髮結束時,HTML被渲染返回到瀏覽器進行顯示。

在回發期間多次更新頁面實際上不是很容易。但是對於你在做什麼,有一個更簡單的解決方案。在請求開始處使用JavaScript將標題更改爲「正在...」,然後讓方法返回「已完成」。

+0

@Craig,謝謝你。我雖然糾結了 - 如何添加一個Javascript和c#事件到我的按鈕? – Ben 2010-01-07 16:52:15

1

因爲它是一個網頁,和最終值是什麼是發送到瀏覽器。所有服務器端代碼都會執行,然後將最終值發送給瀏覽器。

您的代碼正在使用服務器上的新值更新控件,但它不會被客戶端看到。要做你想做的事情,你必須通過客戶端腳本(javascript)來更新控件,或者你必須刷新頁面並顯示更新後的值。

這是一個鏈接到asp.net頁面生命週期這是有點你在問什麼。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

如果你注意到沒有被髮送到瀏覽器,直到Render方法。

0

如果是ASP.NET,所有代碼將在發送html到瀏覽器之前執行,所以只顯示最後一個值。如果你想在客戶端做到這一點,你將不得不做一些JavaScript。

1

您需要了解網絡的工作原理;

  1. 瀏覽器從服務器
  2. 請求一個頁面服務器發送頁面(和可能會做一些服務器端處理,比如ASP.net)
  3. 在客戶端顯示的頁面,並運行在Java腳本頁面

然後,這些javascripts可能會在頁面加載後更改頁面,但步驟2無法執行並更改已發送到客戶端的內容。

3

如果你想計算一個進程的時間並把結果放到一個標籤上,你應該在你的函數中使用一個字符串。嘗試是這樣的:

string countDownTimes = ""; 
countDownTimes += String.Format("One at: {0}, ",DateTime.Now.ToString()); 
System.Threading.Thread.Sleep(1000); 
countDownTimes += String.Format("Two at: {0}, ",DateTime.Now.ToString()); 
//etc.. 
errorMessage.Text = countDownTimes; 

如果您尋找更新的增量UI按鈕,那麼你應該看看一個JavaScript的解決方案或異步更新。