簡體   English   中英

如何在C#中制作動態TextBox

[英]How to make Dynamic TextBox in C#

我有簡單的FormApplication腳本,其中包含按鈕和一些TextBox。 我想點擊按鈕時,一個文本框顯示一些數字。 我怎樣才能做到這一點。

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

現在它等待循環完成並顯示最新的數字。 我希望它在TextBox中循環顯示每個數字。 似乎使用Dynamic TextBox有點難,有沒有其他解決方案以主窗體顯示這些數字? 問候,

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

例如:

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

你必須將Random放在循環之外,因為它是以當前時間播種的,並且循環執行得太快。

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

MSDN

隨機數生成從種子開始 如果重復使用相同的種子, 則生成相同的數字序列 產生不同序列的一種方法是使種子值與時間相關,從而與每個新的Random實例產生不同的序列。 默認情況下,Random類的無參數構造函數使用系統時鍾生成其種子值 ,而其參數化構造函數可以根據當前時間中的滴答數采用Int32值。 但是,由於時鍾具有有限的分辨率,因此使用無參數構造函數以緊密連續的方式創建不同的隨機對象會創建隨機數生成器,從而生成相同的隨機數序列。

但是,由於循環執行速度非常快,因此無論如何都不會看到每個值,只有最后一個。

您可以添加一個面板,然后在其上添加文本框

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

您應該將線程分開並在那里計算數字然后更新UI,因為現在您的UI將在計算完成后更新。

例如BackgroundWorker

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

那是因為操作是單線程的,因此在完成之前沒有UI更新。 如何更改這取決於這是Windows應用程序還是Web應用程序。

例如,如果這是一個Windows窗體應用程序,那么每次循環迭代時,您都希望調用Application.DoEvents()來更新UI:

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

這將每次更新UI的文本框。 (雖然它會非常快,所以我懷疑你甚至會注意到它。如果你想減慢它,你可能會拋出一個Thread.Sleep() 。)

如果這是一個Web應用程序,那么您將希望在客戶端而不是服務器端執行此操作。 這是因為至少從服務器的角度來看,在Web應用程序中“更新UI”意味着返回響應並等待另一個請求。 這將導致瀏覽器和服務器之間的大量反復,僅用於更新單個UI元素。 (雖然它會很慢,你會注意到它,但它會是一個糟糕的用戶體驗。)所以在這種情況下,你想要將代碼移動到JavaScript,這樣做的好處是沒有單線程和會像你期望的那樣更新UI。

如果要在文本框中顯示每個數字,則需要一個額外的線程來運行button1_Click中的代碼。 使用當前的實現,GUI將在執行內容時凍結。 因為它很快你不會注意到它。 從附加線程中,在設置txt3時調用invoke以與GUI線程同步。 並在for循環中添加Thread.Sleep(1000)或類似內容以查看數字更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM