C# 计时器和列表<;字符串>;在C中#

C# 计时器和列表<;字符串>;在C中#,c#,C#,我需要计时器和列表的帮助 列表由字符串集合组成,比如每次5或6。现在,我想在label1上显示字符串1,它应该等待5s,然后在label1上显示字符串2。我有定时器控件,我正在定时器滴答事件中指定我的代码 private void timer1_Tick(object sender, EventArgs e) { string[] myStatus = myStatusCollection.ToArray(); int length = myStatus.

我需要计时器和列表的帮助

列表由字符串集合组成,比如每次5或6。现在,我想在label1上显示字符串1,它应该等待5s,然后在label1上显示字符串2。我有定时器控件,我正在定时器滴答事件中指定我的代码

private void timer1_Tick(object sender, EventArgs e)
    {
        string[] myStatus = myStatusCollection.ToArray();
        int length = myStatus.Length;

        for (int i = 0; i < length; i++)
        {
            string _myStatus = myStatus[i];
            //label1.ResetText();
            MessageBox.Show("Twitter Status =" + _myStatus);
            //label1.Text = _myStatus;
            //label1.Visible = true;
        }

    }
private void timer1\u勾选(对象发送方,事件参数e)
{
字符串[]myStatus=myStatusCollection.ToArray();
int length=myStatus.length;
for(int i=0;i
我已经指定了,Elapse=true,interval=5000,但仍然无法一次显示一个字符串。事实上,我只得到最后一根弦。我想一直旋转琴弦


有人能帮我吗。

这是因为每次触发计时器事件时,您都在遍历所有字符串

将索引存储在一个私有变量中,并改用它

private int _index = 0;

private void timer1_Tick(object sender, EventArgs e)
{
    string[] myStatus = myStatusCollection.ToArray();

    string _myStatus = myStatus[_index];
    //label1.ResetText();
    MessageBox.Show("Twitter Status =" + _myStatus);
    //label1.Text = _myStatus;
    //label1.Visible = true;

    if(_index == (myStatus.Length - 1))
       _index = 0;
    else
       _index++;
}

这是因为每次触发计时器事件时,您都在遍历所有字符串

将索引存储在一个私有变量中,并改用它

private int _index = 0;

private void timer1_Tick(object sender, EventArgs e)
{
    string[] myStatus = myStatusCollection.ToArray();

    string _myStatus = myStatus[_index];
    //label1.ResetText();
    MessageBox.Show("Twitter Status =" + _myStatus);
    //label1.Text = _myStatus;
    //label1.Visible = true;

    if(_index == (myStatus.Length - 1))
       _index = 0;
    else
       _index++;
}

嗯,它正在做你告诉它的事情。然而,你让它做的并不是你想让它做的。试试这个

public class Form1 : Form {

    private string[] statuses = { "A", "B", "C", "D", "E" }; // Init with proper values somewhere
    private int index = 0;

    private void OnTimerTick(object sender, EventArgs e) {
        string status = statuses[index];

        index++;

        if (index == statuses.Length) { // If index = Array.Length means we're 
                                        // outside bounds of array
            index = 0;
        }
    }
}

嗯,它正在做你告诉它的事情。然而,你让它做的并不是你想让它做的。试试这个

public class Form1 : Form {

    private string[] statuses = { "A", "B", "C", "D", "E" }; // Init with proper values somewhere
    private int index = 0;

    private void OnTimerTick(object sender, EventArgs e) {
        string status = statuses[index];

        index++;

        if (index == statuses.Length) { // If index = Array.Length means we're 
                                        // outside bounds of array
            index = 0;
        }
    }
}

我会在刻度线外创建一个int来保持你的位置。请确保在重新启动进程时将其重置回0

int MyPosition = 0;

private void timer1_Tick(object sender, EventArgs e) 
{ 
    string[] myStatus = myStatusCollection.ToArray(); 
    int length = myStatus.Length; 

    if((MyPosition + 1) > length)
    {
        //Index Out of Range
    }
    else
    {
        string _myStatus = myStatus[MyPosition];
        label1.Text = _myStatus 
    }

    MyPosition++;
}

我会在刻度线外创建一个int来保持你的位置。请确保在重新启动进程时将其重置回0

int MyPosition = 0;

private void timer1_Tick(object sender, EventArgs e) 
{ 
    string[] myStatus = myStatusCollection.ToArray(); 
    int length = myStatus.Length; 

    if((MyPosition + 1) > length)
    {
        //Index Out of Range
    }
    else
    {
        string _myStatus = myStatus[MyPosition];
        label1.Text = _myStatus 
    }

    MyPosition++;
}

MessageBox是一种奇怪的方法,可以在循环内进行测试,将MessageBox替换为System.Diagnostics.Debug.WriteLine并检查Visual Studio的输出窗口以查看结果,这不会阻止UI或等待用户输入。是的,的确messagebox在这种情况下是没有用的,它会停止程序流,直到从用户那里得到任何动作。label1.Text=_myStatus;这样就可以了,你可以使用这个方法作为线程,每个循环睡眠5秒,然后完成它。如果您想使用类似brandone答案的计时器,则每个勾号都是一个单独的循环(已考虑)使用索引,最后不要忘记停止计时器>MessageBox是一种奇怪的循环内测试方法,请将MessageBox替换为System.Diagnostics.Debug.WriteLine,并检查Visual Studio的输出窗口以查看结果,这不会阻止用户界面或等待用户输入。是的,的确messagebox在这种情况下是没有用的,它会停止程序流,直到从用户那里得到任何动作。label1.Text=_myStatus;这样就可以了,你可以使用这个方法作为线程,每个循环睡眠5秒,然后完成它。如果你想像brandone的答案一样使用计时器,那么每个刻度都是一个单独的循环(考虑过),使用索引,最后不要忘记停止计时器>非常感谢。我能够以固定的间隔一个接一个地显示字符串。还有一件事,如果我想旋转所有字符串,一旦它被显示。你可能会超过数组的范围!那么为什么我需要在每个刻度上获得一个数组,但我只需要一个元素。我认为如果你在启动te定时器之前获得数组,这会更好。@RushabhShah,如果你想再次开始循环,那么在到达终点时,只需将索引设置为0即可。艾哈迈德,你可以通过几次检查来防范。至于获得一次数组,可能会更好,但由于他没有指定myStatusCollection来自何处,所以我将它保留为原样。非常感谢。我能够以固定的间隔一个接一个地显示字符串。还有一件事,如果我想旋转所有字符串,一旦它被显示。你可能会超过数组的范围!那么为什么我需要在每个刻度上获得一个数组,但我只需要一个元素。我认为如果你在启动te定时器之前获得数组,这会更好。@RushabhShah,如果你想再次开始循环,那么在到达终点时,只需将索引设置为0即可。艾哈迈德,你可以通过几次检查来防范。至于只获取一次数组,可能会更好,但由于他没有指定myStatusCollection来自何处,所以我将其保留原样。