如何在C#中制作动态TextBox

时间:2013-08-29 12:34:57

标签: 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有点难,有没有其他解决方案以主窗体显示这些数字? 的问候,

6 个答案:

答案 0 :(得分:2)

你需要在单独的线程中进行,并在每次迭代之间休眠或使用计时器。

例如:

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

答案 1 :(得分:1)

你必须将Random置于循环之外,因为它是以当前时间播种的,并且循环执行得太快。

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

MSDN

  

随机数生成从种子值开始。如果相同   种子被重复使用,生成相同系列的数字。一   产生不同序列的方法是制作种子价值   与时间有关,从而与每个新系列产生不同的系列   随机的实例。默认情况下,无参数构造函数   随机类使用系统时钟生成其种子值,而   它的参数化构造函数可以取基于的Int32值   当前时间的刻度数。但是,因为时钟已经   有限分辨率,使用无参数构造函数创建   紧密连续的不同随机对象创建随机数   产生相同随机数序列的生成器。

但是,由于循环执行速度非常快,因此无论如何都不会看到每个值,只会看到最后一个。

答案 2 :(得分: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);
     }

答案 3 :(得分:0)

你应该分开线程并在那里计算数字然后更新UI,因为现在你的UI将在计算结束后更新。

E.g。 BackgroundWorker

答案 4 :(得分:0)

  

现在它等待循环结束并显示最新的数字。

那是因为操作是单线程的,因此在完成之前没有UI更新。如何更改这取决于这是Windows应用程序还是Web应用程序。

如果这是,例如,Windows窗体应用程序,那么每次循环迭代时,您都希望调用Application.DoEvents()来更新UI:

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

每次都会更新UI的文本框。 (虽然它会非常快,所以我怀疑你甚至会注意到它。如果你想放慢速度,你可能会投入Thread.Sleep()。)

如果这是一个Web应用程序,那么您将希望在客户端而不是服务器端执行此操作。这是因为至少从服务器的角度来看,在Web应用程序中“更新UI”意味着返回响应并等待另一个请求。这将导致浏览器和服务器之间的大量反复,仅用于更新单个UI元素。 (虽然它会慢到你会注意到它,但它会是一个糟糕的用户体验。)所以在这种情况下你想要将代码移动到JavaScript,这样做的好处是没有单线程和会按照您的预期更新用户界面。

答案 5 :(得分:0)

如果要在文本框中显示每个数字,则需要一个额外的线程来运行button1_Click中的代码。使用当前的实现,GUI将在执行内容时冻结。因为它很快你不会注意到它。 从附加线程中,在设置txt3时调用invoke以与GUI线程同步。并在for循环中添加Thread.Sleep(1000)或类似内容以查看数字更改。