2013-08-29 64 views
2

我有簡單的FormApplication腳本包含按鈕和一些文本框。 我想要點擊按鈕時,一個文本框顯示一些數字。 我如何才能做到這一點。如何使動態文本框在C#

private void button1_Click(object sender, EventArgs e) 
{ 
    txt3.Text = ""; 
    for (int i = 0; i <50; i++) 
    { 
     Random random = new Random(); 
     int randomNumber = random.Next(100, 150); 
     txt3.Text = randomNumber.ToString(); 
    } 
} 

現在它等待循環完成並顯示最新的數字。 我希望它在文本框中循環顯示每個數字。 似乎使用動態文本框有點難,有沒有其他的解決方案來顯示這些數字的主要形式? Regards,

+0

該循環會很快完成,你想讓它在每個數字之間有一個延遲? –

+0

我添加了計時器但不起作用。 – user1955534

+0

將您的更新後的代碼添加到問題 –

回答

0

現在它等待循環完成並顯示最新的數字。

這是因爲操作是單線程的,所以在完成之前沒有UI更新。你將如何改變這取決於這是一個Windows應用程序還是一個Web應用程序。

如果是這樣,例如,Windows窗體應用程序,那麼你要調用Application.DoEvents()每次更新UI循環迭代:

txt3.Text = randomNumber.ToString(); 
Application.DoEvents(); 

這將更新UI的文本框中各一次。(雖然這將是非常,所以我懷疑你甚至會發現它。如果你想慢下來,你可能會在Thread.Sleep()扔。)

如果這是一個Web應用程序,那麼你會想要在客戶端而不是服務器端完成這一切。這是因爲至少從服務器的角度來看,Web應用程序中的「更新UI」意味着返回響應並等待另一個請求。這會在瀏覽器和服務器之間產生大量的來回更新單個UI元素。 (雖然它會很慢,你會注意到它,但這將是一個糟糕的用戶體驗。)所以在這種情況下,你需要將代碼轉移到JavaScript,這有利於不是單線程的,會按照您的預期更新UI。

+0

在UI線程中執行Thread.Sleep()是否明智?還有什麼Application.DoEvents();究竟? –

+0

@NoIdeaForName:不是,不。關於定時器和單獨線程的其他答案是更好的設計,我只是想我會提供另一個答案OP可能會發現有幫助。我認爲'Application.DoEvents()'是OP真正想要的,而不是任何類型的線程或延遲。對於像這樣簡單的事情來說,它往往可以很好地完成工作。它所做的只是在代碼中循環UI事件(重新繪製,響應輸入等)中的某種中斷。 – David

+0

謝謝,很高興知道 –

1

您必須將Random放在循環的外部,因爲它是用當前時間播種並且循環執行得太快。從種子值

Random random = new Random(); 
for (int i = 0; i <50; i++) 
{ 
    int randomNumber = random.Next(100, 150); 
    txt3.Text = randomNumber.ToString(); 
} 

MSDN

隨機數生成啓動。如果重複使用相同的 種子,則會生成同一系列的數字。一種產生不同序列的方法是使種子值 具有時間依賴性,由此產生與每個新的Random實例不同的系列。默認情況下, 隨機類的無參數構造函數使用系統時鐘生成其種子值,而其參數化構造函數的 可以基於當前時間內的 數量的滴答取得Int32值。但是,由於時鐘具有有限分辨率,因此使用無參數構造函數創建 不同的隨機對象會緊密連續生成隨機數 生成器,以生成相同的隨機數序列。

但是,由於循環執行速度非常快,您將無法看到每個值,只能看到最後一個值。

+0

我不認爲這會改變OP所看到的內容,但文本框仍然會顯示最後一個數字(其他數字會過快)。 –

+0

@KevinDiTraglia:是的,你說得對。這是不是真的很清楚OP想要實現什麼。如果他想更新TextBox來報告進度,他應該使用'BackGroundWorker'並且它是更新UI線程的適當事件。但是,這也會太快而不被注意,所以他需要某種延遲。 –

+0

增加了定時器進入睡眠狀態,每2秒顯示一個新的數字。 – user1955534

0

您可以添加一個面板,然後添加文本框到它

Random random = new Random(); 
    for (int i = 0; i <50; i++) 
    { 
     TextBox t=new TextBox(); 
     int randomNumber = random.Next(100, 150); 
     t.Text = randomNumber.ToString(); 
    panel.Controls.Add(t); 
    } 
+0

試過面板,但是這個隱藏文本框 – user1955534

+0

不,它不會。如果是這樣,也許你應該檢查你的CSS。 – Kuzgun

0

,您最好在單獨的線程,並計算有數字和更新UI的話,因爲現在計算完成後,你的用戶界面將被更新。

E.g. BackgroundWorker

3

你需要在單獨的線程和每次迭代之間進行睡眠或使用計時器。

例如:

private int counter; 
Timer t = new Timer(); 
Random random = new Random(); 

private void button1_Click(object sender, EventArgs e) 
{ 
    t.Interval = 100; 
     t.Tick += new EventHandler(t_Tick); 
     counter = 0; 
     t.Enabled = true; 
    txt3.Text = ""; 
} 

    void t_Tick(object sender, EventArgs e) 
    { 
    counter++; 
    int randomNumber = random.Next(100, 150); 
    txt3.Text = randomNumber.ToString(); 

    if (counter >= 50) 
    { 
     t.Enabled = false; 
    } 
    } 

記住這只是一個例子出百萬的方式做到這一點。他們中的很多都不錯

另一種方式將使用線程:

private void button1_Click(object sender, EventArgs e) 
{ 
    Thread t = new Thread(new ThreadStart(randomize)); 
    t.Start(); 
} 

    private void randomize() 
    { 
    Random random = new Random(); 

    txt3.Text = ""; 
    for (int i = 0; i < 50; i++) 
    { 
     int randomNumber = random.Next(100, 150); 

     Invoke(new setTxtHandler(setText), randomNumber.ToString()); 

     Thread.Sleep(100); 
    } 
    } 

    private void setText(string val) 
    { 
    txt3.Text = val;   
    } 

    private delegate void setTxtHandler(string val); 
+0

我檢查了第一種方法,它只顯示最後一個數字。 – user1955534

+0

@ user1955534如果我可以上傳電影,我會,它的工作....沒有變化... –

+0

@ user1955534一件事,但確保它是System.Windows.Forms.Timer –

0

如果你想顯示在文本框中的每個號碼,您將需要一個額外的線程將運行你的代碼裏面的button1_Click。使用您當前的實現,GUI將在執行內容時凍結。因爲它非常快,你不會注意到它。 從附加線程調用txt3與GUI線程同步時調用。並在for循環中添加一個Thread.Sleep(1000)或類似的函數,以便查看數字的變化。