2014-08-29 55 views
0

我试图让标签每秒刷新一次,所以倒计时更新,有一些麻烦。对于noob问题,我对C#道歉极为新颖。标签文本每秒刷新

private void Form1_Load(object sender, EventArgs e) 
{ 
    bool ephCD = true; 
    int ephHours = (DateTime.Today.AddDays(1) - DateTime.Now).Hours; 
    int ephMinu = (DateTime.Today.AddDays(1) - DateTime.Now).Minutes; 
    int ephSecs = (DateTime.Today.AddDays(1) - DateTime.Now).Seconds; 

    label1.Text = ephHours.ToString() + ":" + ephMinu.ToString() + ":" + ephSecs.ToString(); 

    while (ephCD == true) 
    { 
     label1.Refresh(); 
    } 
} 

当启动此程序甚至不出现。

为什么程序不显示?

+2

什么是_trouble_? – 2014-08-29 20:34:59

+0

当启动这个程序甚至不出现时,我假设while循环如此快速地刷新帧,我甚至不能看到它。 label1的倒计数不更新,它是静态的。 – user3708761 2014-08-29 20:36:28

回答

6

您正在执行的无限循环。这意味着表单将永远不会完成加载,并且您的程序将被卡住。

您的刷新循环需要位于单独的线程上,或者理想情况下折腾循环并使用Timer而不是在死循环中旋转锁定CPU。

Timer myTimer = new Timer(1000); 
void Form1_Load() 
{ 
    myTimer.Elapsed += UpdateLabel; 
    myTimer.Start(); 
} 

private void UpdateLabel(object sender, ElapsedEventArgs e) 
{ 
    //Update label here 
} 
0

while声明更新标签不是一个很好的选择,更好的方法是使用Timer

var aTimer = new System.Timers.Timer(1000); 
    aTimer.Elapsed += OnTimedEvent; 
    aTimer.Enabled = true; 


private static void OnTimedEvent(Object source, ElapsedEventArgs e) 
{ 
    //update the label 
} 
1

这样做,只是复制和粘贴:

private void Form1_Load(object sender, EventArgs e) 
    { 
     // To update the first time. 
     label1.Text = (DateTime.Today.AddDays(1)- DateTime.Now).ToString(@"hh\:mm\:ss"); 
     var timer = new Timer {Interval = 1000}; 
     timer.Tick += (o, args) => 
     { 
      label1.Text = (DateTime.Today.AddDays(1)- DateTime.Now).ToString(@"hh\:mm\:ss"); 
     }; 
     timer.Start(); 
    } 
+1

表单处理完毕后,该计时器将保持打勾状态。您应该将计时器声明移到表单级别。 – LarsTech 2014-08-29 21:08:59