当我在一个windows窗体应用程序上执行这个for循环时,我点击一个按钮来启动这个for循环,标签只是变成了数组中的最后一项,我如何让它一次遍历数组中的一项?
for (int i = 0; i < WordsnQuestions.questions.Length; i++) { lblScrambled.Text = WordsnQuestions.questions [i++]; }
x7rlezfr1#
循环速度太快...循环中每个项目的标签都会更改(注意:循环,而不是数组,因为另一个问题),但是窗体没有机会重画任何东西,直到循环已经完成。此时我们已经到了最后一项,所以这就是我们看到的。解决此问题的典型方法是将索引移到方法之外,并仅为每个事件显示一个项目:
int currentPosition = 0; public void btnNext_Click(object sender, EventArgs e) { lblScrambled.Text = WordsnQuestions.questions [currentPosition++]; if (currentPosition >= WordsnQuestions.questions.Length) currentPosition = 0; }
除此之外,原始代码在每次循环迭代时将计数器递增两次......但是,正确设计交互首先可以避免这种情况。但是假设你想要一个动画效果,那么你可以尝试像这样的方法来减慢速度(注意只使用了一个增量操作符):
for (int i = 0; i < WordsnQuestions.questions.Length; i++) { lblScrambled.Text = WordsnQuestions.questions [i]; Thread.Sleep(1000); }
但是这个仍然不起作用,因为代码仍然没有将控制权交还给窗体,以便它可以重新绘制窗口。现在,您可能会尝试执行以下操作:
for (int i = 0; i < WordsnQuestions.questions.Length; i++) { lblScrambled.Text = WordsnQuestions.questions [i]; Application.DoEvents(); Thread.Sleep(1000); }
这看起来似乎(finally!)起作用了,因为它确实允许一个事件循环最终处理每个WM_PAINT messages。然而,它仍然存在各种各样的问题。同样,正确的解决方案是真正更仔细地考虑交互应该如何在第一时间工作。
xghobddn2#
这里有两个问题:
for (int i = 0; i < WordsnQuestions.questions.Length; i++) { lblScrambled.Text += WordsnQuestions.questions [i]; }
2条答案
按热度按时间x7rlezfr1#
循环速度太快...循环中每个项目的标签都会更改(注意:循环,而不是数组,因为另一个问题),但是窗体没有机会重画任何东西,直到循环已经完成。此时我们已经到了最后一项,所以这就是我们看到的。
解决此问题的典型方法是将索引移到方法之外,并仅为每个事件显示一个项目:
除此之外,原始代码在每次循环迭代时将计数器递增两次......但是,正确设计交互首先可以避免这种情况。
但是假设你想要一个动画效果,那么你可以尝试像这样的方法来减慢速度(注意只使用了一个增量操作符):
但是这个仍然不起作用,因为代码仍然没有将控制权交还给窗体,以便它可以重新绘制窗口。
现在,您可能会尝试执行以下操作:
这看起来似乎(finally!)起作用了,因为它确实允许一个事件循环最终处理每个WM_PAINT messages。然而,它仍然存在各种各样的问题。同样,正确的解决方案是真正更仔细地考虑交互应该如何在第一时间工作。
xghobddn2#
这里有两个问题:
下面是更新后的代码,您可以尝试使用: