更改按钮单击中的标签文本 - 理解 For 循环
Changing The Label Text in Button Click - Understanding For Loop
当我单击按钮时,从 i=0 开始循环,我想查看 i 的标签值。但是我只看到 i 的最后一个值。
public partial class Form1 : Form
{
int i;
public Form1()
{
InitializeComponent();
}
private void btnclick_Click(object sender, EventArgs e)
{
for ( i = 0; i < 3; i++)
{
lblForLoopExample.Text = i.ToString();
System.Threading.Thread.Sleep(1000);
}
}
}
当我 运行 我的代码时,我只在标签上看到; 2
。
我想在下面看到这样的赞;
当开始For循环时,i=0,我一定看到Label.Text上的0。然后当 i = 1 时,我必须在 label.Text 上看到 1。当 i = 2 时,我必须在 Label.Text 上看到 2。
我添加了 Thread.Sleep(1000) 但是,结果没有改变。
我哪里搞错了?
请帮帮我,
如果你帮助我,我会感激你。
谢谢,
您需要附加 lbl 以获取所有值。现在,它完成循环并为您提供标签中的最后一个值
public partial class Form1 : Form
{
int i;
public Form1()
{
InitializeComponent();
}
private void btnclick_Click(object sender, EventArgs e)
{
for ( i = 0; i < 3; i++)
{
lblForLoopExample.Text + = i.ToString();
}
}
}
每次循环你重新写字符串。而不是说
lblForLoopExample.Text = i.ToString();
您需要在每次迭代时添加到字符串中。我会创建一个变量来保存值,所以像这样:
string myString = string.Empty;
for(i=0;i < 3; i++)
{
myString += i.ToString() + ", ";
}
lblForLoopExample.Text = myString.substring(0, (myString.length - 1));
substring 只是为了让您没有尾随逗号。这是一种肮脏的代码,但它会起作用。
首先,您的代码无法编译,因为您缺少 i.ToString
中 ToString()
方法的确切格式以及 ;
lblForLoopExample.Text = i.ToString();
^^^
根据您的代码,您应该试试这个:
for ( i = 0; i < 3; i++)
{
lblForLoopExample.Text += i.ToString() + ", ";
}
您的问题是您在 UI 线程上工作,同时期望 UI 线程更新您的表单。
当您处理循环时,UI 线程实际上正在执行此代码。因此 UI 线程无法使用您在循环中设置的中间值更新表单。代码完成后,UI 线程便可以自由更新表单。这就是为什么您只看到最后一个值的原因。
如果您将代码更新为循环 1000 万次而不是 3 次,您可以更好地看到这一点。您的表单将变得无响应并且看起来被锁定。那是因为 Windows 知道你的 UI 线程被锁定在一个密集的进程中并且无法更新 UI.
解决方案是使用后台线程 运行 您的进程并与 UI 线程同步更新。正如其他人所建议的那样,您还必须放慢循环速度才能看到变化。
要了解有关 UI 线程如何工作以及如何与其同步后台线程的更多信息,read this article(它是关于 WPF 的,但涵盖了一般情况)。
当我单击按钮时,从 i=0 开始循环,我想查看 i 的标签值。但是我只看到 i 的最后一个值。
public partial class Form1 : Form
{
int i;
public Form1()
{
InitializeComponent();
}
private void btnclick_Click(object sender, EventArgs e)
{
for ( i = 0; i < 3; i++)
{
lblForLoopExample.Text = i.ToString();
System.Threading.Thread.Sleep(1000);
}
}
}
当我 运行 我的代码时,我只在标签上看到; 2
。
我想在下面看到这样的赞;
当开始For循环时,i=0,我一定看到Label.Text上的0。然后当 i = 1 时,我必须在 label.Text 上看到 1。当 i = 2 时,我必须在 Label.Text 上看到 2。
我添加了 Thread.Sleep(1000) 但是,结果没有改变。
我哪里搞错了?
请帮帮我, 如果你帮助我,我会感激你。
谢谢,
您需要附加 lbl 以获取所有值。现在,它完成循环并为您提供标签中的最后一个值
public partial class Form1 : Form
{
int i;
public Form1()
{
InitializeComponent();
}
private void btnclick_Click(object sender, EventArgs e)
{
for ( i = 0; i < 3; i++)
{
lblForLoopExample.Text + = i.ToString();
}
}
}
每次循环你重新写字符串。而不是说
lblForLoopExample.Text = i.ToString();
您需要在每次迭代时添加到字符串中。我会创建一个变量来保存值,所以像这样:
string myString = string.Empty;
for(i=0;i < 3; i++)
{
myString += i.ToString() + ", ";
}
lblForLoopExample.Text = myString.substring(0, (myString.length - 1));
substring 只是为了让您没有尾随逗号。这是一种肮脏的代码,但它会起作用。
首先,您的代码无法编译,因为您缺少 i.ToString
中 ToString()
方法的确切格式以及 ;
lblForLoopExample.Text = i.ToString();
^^^
根据您的代码,您应该试试这个:
for ( i = 0; i < 3; i++)
{
lblForLoopExample.Text += i.ToString() + ", ";
}
您的问题是您在 UI 线程上工作,同时期望 UI 线程更新您的表单。
当您处理循环时,UI 线程实际上正在执行此代码。因此 UI 线程无法使用您在循环中设置的中间值更新表单。代码完成后,UI 线程便可以自由更新表单。这就是为什么您只看到最后一个值的原因。
如果您将代码更新为循环 1000 万次而不是 3 次,您可以更好地看到这一点。您的表单将变得无响应并且看起来被锁定。那是因为 Windows 知道你的 UI 线程被锁定在一个密集的进程中并且无法更新 UI.
解决方案是使用后台线程 运行 您的进程并与 UI 线程同步更新。正如其他人所建议的那样,您还必须放慢循环速度才能看到变化。
要了解有关 UI 线程如何工作以及如何与其同步后台线程的更多信息,read this article(它是关于 WPF 的,但涵盖了一般情况)。