現在の時刻に応じてラベルの Text プロパティを変更するにはどうすればよいですか?
ありがとうございました
明確にするために:
ラベルのテキストを午前 10 時から午後 5 時まで開いて読み、午後 5 時 1 分から午前 9 時 59 分まで閉じて読みたいと思います。
タイマーを使用します。Timer.Tick ハンドラーで、DateTime.Now に基づく単純な if/else ステートメントを使用して、ラベルの Text プロパティを変更します。
int hour = DateTime.Now.Hour;
if (hour >= 10 && hour < 17)
//Open 10:00am through 4:59pm
LabelStatus.Text = "Open";
else
//Closed 5:00pm through 9:59am
LabelStatus.Text = "Closed";
以下は、ラベルを更新する別のスレッドを使用してこれを行う方法です。このようにして、スレッドはバックグラウンドで実行され、ラベルが正しいステータスにあることを常にチェックします。フォームを閉じるときは、必ず Thread.Abort() を使用して、常にスローされると思われる例外をキャッチするか、while ループの条件としてフラグを追加し、フラグを下げてスレッドを停止してください。スレッド。
他のオブジェクトがラベルにアクセスしない限り、スレッドのどの部分もロックする必要はありません。
public delegate void DelLabelText(Label l, string s);
public DelLabelText delLabelText;
public Form1()
{
InitializeComponent();
delLabelText = Label_Text;
// Initialize text
lblOpenStatus.Text = "Closed";
// Create and start thread
Thread threadUpdateLabel = new Thread(UpdateLabel_Threaded);
threadUpdateLabel.Start();
}
// Thread function that constantly checks if the text is correct
public void UpdateLabel_Threaded()
{
while (true)
{
Thread.Sleep(5000);
// 24 hour clock so 17 means 5
if ((DateTime.Now.Hour >= 10 && DateTime.Now.Hour < 17) || (DateTime.Now.Hour == 17 && DateTime.Now.Minute == 0 && DateTime.Now.Second == 0))
{
if (lblOpenStatus.Text.ToLower() == "closed")
{
Label_Text(lblOpenStatus, "Open");
}
}
else
{
if (lblOpenStatus.Text.ToLower() == "open")
{
Label_Text(lblOpenStatus, "Closed");
}
}
}
}
// Set the text using invoke, because text is changed outside of main thread
public void Label_Text(Label label, string text)
{
if (label.InvokeRequired)
{
label.Invoke(delLabelText, new object[] { label, text });
}
else
{
label.Text = text;
}
}
フォームにタイマーを追加し、その間隔を 1000 ミリ秒に設定します。
ティックごとにタイマーによって更新される現在の時間のミリ秒を持つ非表示の TextBox を宣言します。
Textbox の TextBox.TextChanged イベントで、ミリ秒を時間に変換する関数を追加します...
次の方法は、タイマーを追加し、間隔を 1 ミリ秒に設定することです...
そこから時間を更新..
次のメソッドは、BackgroundWorker を追加し、それをタイマーとして使用して時間を更新することです...
上記の方法のいずれかが有用であると思われる場合は、コメントしてください。コードを投稿します。:)