2012-02-16 8 views
0

タイマーとリストのヘルプが必要です。タイマーとリスト<string> in C#

リストは、一度に5または6と言う文字列のコレクションで構成されます。今、私はlabel1上に文字列1を表示する必要があり、それは5秒待ってからlabel1に文字列2を表示する必要があります。私はタイマーコントロールを持っており、timer_tickイベントで自分のコードを指定しています。

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; 
     } 

    } 

Elapse = trueおよびinterval = 5000と指定しましたが、一度に1つの文字列を表示できません。実際、私は最後の文字列だけを取得しています。私はいつも弦を回転させたい。

誰でも助けてくれますか?

+1

メッセージボックスには、ループ内でテストSystem.Diagnostics.Debug.WriteLineとメッセージボックスを交換し、これは、UIをブロックしたりするために待機しません、結果を確認するためのVisual Studioの[出力]ウィンドウをチェックする奇妙な方法でありますユーザ入力。このように見えるのはどうですか? –

+0

はいメッセージボックスは、このような場合には有用ではありません。ユーザから何らかのアクションが得られるまでプログラムフローを停止します。 label1.Text = _myStatus;これはスレッドとスリープ5秒ごとのループとしてこのメ​​ソッドを使用して終了することができますそれを行います。もしあなたがbrandoneの答えのようなタイマーを使いたいのなら、それぞれのティックは別々のループ(考えられる)を使用するインデックスで、最後にタイマーを止めることを忘れないでください> – ahmedsafan86

答えて

1

これは、あなたが話したとおりです。しかし、あなたが言ったことは、それがあなたがすることを意味するものではありません。これを試して。

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; 
     } 
    } 
} 
+0

ありがとうございました。 –

+0

あなたは歓迎です。 –

3

これは、タイマーイベントが発生するたびにすべての文字列をループしているためです。

インデックスをプライベート変数に格納し、それを代わりに使用します。

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++; 
} 
+0

ありがとう。私は定期的な間隔で文字列を一つずつ表示することができました。もうひとつ、それが表示されたら、すべての文字列を回転させたいのですが? –

+0

配列の範囲を超えている可能性があります。なぜ私は各チックごとに配列を取得する必要がありますが、私は1つの要素が必要です。私はあなたがteタイマーを開始する前に配列を取得すればこれが良いと思います。 – ahmedsafan86

+0

@ RushabhShah、もう一度ループを開始したい場合は、最後に達したときにインデックスを0に設定するだけです。 Ahmed、あなたはそれをいくつかの点検で守ることができます。配列を一度取得するのはおそらくもっと良いでしょうが、myStatusCollectionがどこから来たのかを指定していないので、そのまま残しました。 – Brandon

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++; 
}