1

我有简单的 FormApplication 脚本,其中包含按钮和一些文本框。我想在单击按钮时,一个文本框显示一些数字。我怎样才能使这种动态。

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 的循环中分别显示每个数字。似乎使用动态文本框有点难,有没有其他解决方案可以在主窗体中显示这个数字?问候,

4

6 回答 6

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);
于 2013-08-29T12:41:28.403 回答
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 实例产生不同的序列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间的刻度数取一个 Int32 值。但是,由于时钟具有有限的分辨率,因此使用无参数构造函数来创建不同的 Random 对象以紧密连续地创建随机数生成器,这些生成器会生成相同的随机数序列。

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

于 2013-08-29T12:36:26.403 回答
0

您应该在那里分离线程并计算数字并更新 UI,因为现在您的 UI 将在计算完成后更新。

例如后台工作者

于 2013-08-29T12:39:15.847 回答
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);
     }
于 2013-08-29T12:37:53.453 回答
0

现在它等待循环完成并显示最新数字。

这是因为操作是单线程的,所以在完成之前不会更新 UI。您将如何更改取决于这是 Windows 应用程序还是 Web 应用程序。

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

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

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

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

于 2013-08-29T12:41:07.313 回答
0

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

于 2013-08-29T12:41:53.870 回答