我有简单的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有点难,有没有其他解决方案以主窗体显示这些数字? 的问候,
答案 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();
}
随机数生成从种子值开始。如果相同 种子被重复使用,生成相同系列的数字。一 产生不同序列的方法是制作种子价值 与时间有关,从而与每个新系列产生不同的系列 随机的实例。默认情况下,无参数构造函数 随机类使用系统时钟生成其种子值,而 它的参数化构造函数可以取基于的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)或类似内容以查看数字更改。