2012-05-10 45 views
0

我怎么能够根据当前时间更改标签的Text属性?基于当前时间更改Label.Text?

谢谢

澄清:

我想一个标签的文本,以上午10点至下午5点之间,然后打开读取下午5:01之间读封闭上午9时59分。

+0

什么问题的人? – Adil

+0

严,检查时间,如果它看起来像你想要的,更改label.text属性。的 –

+0

可能重复[如何显示更新时间,系统时间使用C#的标签上?(http://stackoverflow.com/questions/5025840/how-to-display-updated-time-as-system-time-on -a-标签使用-C) –

回答

0

现在加入一个计时器,你的形式和时间间隔设置为1000毫秒..

声明具有当前时刻计时器上的每一个滴答更新毫秒一个无形的文本框..

上文本框的TextBox.TextChanged事件从那里添加一个功能转换的毫秒时间...

下一个方法是添加一个定时器和间隔设置为1毫秒...

更新时间..

下一个方法是添加一个BackgroundWorker并使用它作为一个定时器来更新时间...

如果您发现任何有用的上述方法...评论,我会后的代码! :)

+0

这个答案需要一些工作,思维过程是所有的地方,代码将使其更好。 –

+0

@Ramhound的【答案在这里(http://stackoverflow.com/a/10541756/1118933)告诉一切,但如果线程与定时更换,这将更好地工作。 – Writwick

3

使用Timer。在Timer.Tick处理程序中,使用基于DateTime.Now的简单if/else语句修改标签的Text属性。

3
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"; 
+0

您需要详细了解如何使用此代码。这不符合作者的要求。他希望标志在下午5点开放,而不是下午4:59开放,这是有区别的。 –

1

下面是使用更新标签的单独线程执行此操作的方法。这样,线程将在后台运行,并不断检查标签是否处于正确的状态。确保的情况下,无论是使用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; 
     } 
    } 
+2

大量的工作进入了这个答案,但它确实为处理器提供了时间(真),并且是编程的熊。这里每1000毫秒运行一个简单的Timer对象并检查当前时间就足够了。 – MrWuf

+0

增加了一个Thread.sleep代码,但在阅读您的评论后,我不同意,定时器可能是要走的路。 –