当我点击按钮从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)但结果并没有改变。
我犯错误的地方?
请帮帮我, 如果你帮助我,我将感激你。
谢谢,
答案 0 :(得分:1)
您需要附加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();
}
}
}
答案 1 :(得分:0)
重新编写字符串的每个循环。而不是说
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));
子字符串就是这样,你就不会有这个尾随的逗号。这是一种肮脏的代码,但它会起作用。
答案 2 :(得分:0)
首先,您的代码无法编译,因为您遗漏了ToString()
中i.ToString
方法的确切格式以及;
lblForLoopExample.Text = i.ToString();
^^^
根据您的代码,您应该尝试这样做:
for ( i = 0; i < 3; i++)
{
lblForLoopExample.Text += i.ToString() + ", ";
}
答案 3 :(得分:0)
您的问题是您在UI线程上工作,同时期望UI线程更新您的表单。
在处理循环时,UI线程实际上正在执行此代码。因此,UI线程无法使用您在循环中设置的中间值更新表单。代码完成后,UI线程可以自由更新表单。这就是为什么你只看到最后一个值的原因。
如果您将代码更新为循环千万次而不是3次,您可以更好地看到这一点。您的表单将变得无响应并显示为已锁定。这是因为Windows知道您的UI线程在密集的过程中被锁定,无法更新UI。
解决方案是使用后台线程来运行您的进程并使用UI线程同步更新。正如其他人所建议的那样,您还必须放慢循环以查看更改。
要详细了解UI线程的工作原理,以及如何与后台线程同步,read this article(它关于WPF,但它涵盖了一般情况)。