winforms 在数组中一次循环一个元素

xbp102n0  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(122)

当我在一个windows窗体应用程序上执行这个for循环时,我点击一个按钮来启动这个for循环,标签只是变成了数组中的最后一项,我如何让它一次遍历数组中的一项?

for (int i = 0; i < WordsnQuestions.questions.Length; i++)
{
    lblScrambled.Text = WordsnQuestions.questions [i++];
}
x7rlezfr

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。然而,它仍然存在各种各样的问题。同样,正确的解决方案是真正更仔细地考虑交互应该如何在第一时间工作。

xghobddn

xghobddn2#

这里有两个问题:

  1. i++是两次,因此您跳过项目#2、4、6......并循环1、3、5 ......等
  2. lblScrambled。文本将具有最后一项,如果您有奇数项,程序将不会失败。
    下面是更新后的代码,您可以尝试使用:
for (int i = 0; i < WordsnQuestions.questions.Length; i++)
{
    lblScrambled.Text += WordsnQuestions.questions [i];
}

相关问题