2016-03-26 51 views
3

这是我第一次尝试以任何语言学习课程。我正在尝试创建一个停止监视的Windows窗体项目。我创建了一个具有启动秒表的StartClock方法的类,然后将经过的时间放入一个时间跨度变量中。然后我使用一个elapsedTime字符串,并将其设置为等于具有时间跨度变量的格式化字符串。代码如下。将值从一个地方传递到另一个地方

public class CStopWatch 
{ 

    Stopwatch sw = new Stopwatch(); 

    private DateTime startTime; 

    private DateTime stopTime; 

    private String elapsedTime; 

    public String ElapsedTime 
    { 
     get 
     { 
      return elapsedTime; 
     } 


    } 

    public String StartClock() 
    { 

     sw.Start(); 
     TimeSpan ts = sw.Elapsed; 
     elapsedTime = String.Format("{0:00}:{1:00}:{2:00}", 
     ts.Hours, ts.Minutes, ts.Seconds/10); 
     return elapsedTime; 


    } 

    public void StopClock() 
    { 
     // sw.Stop(); 
    } 

} 

在Windows窗体我打电话给我的CStopwatch类的新实例,然后启动按钮点击事件,我开始我的形式计时器,叫我StartClock方法,然后我的时间间隔设置为每一秒。

在我的计时器滴答事件中,我设置我的标签以显示经过时间字符串变量。当我运行这个时,我不会有任何错误,但标签不会改变。以下是我的Windows窗体代码。

public partial class Form1 : Form 
{ 
    // string elapsedTime; 

    // public string elapsedTime { get { return elapsedTime; } } 

    CStopWatch sw = new CStopWatch(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void lblTime_Click(object sender, EventArgs e) 
    { 

    } 


    private void btnStart_Click(object sender, EventArgs e) 
    { 
     timer.Enabled = true; 
     sw.StartClock(); 
     timer.Interval = 1000; 

     //Testing without using classes 
     /* 
     timer.Enabled = true; 
     sw.Start(); 
     timer.Interval = 1000; 
     TimeSpan ts = sw.Elapsed; 
     string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}", 
     ts.Hours, ts.Minutes, ts.Seconds/10); 
     */ 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void timer_Tick(object sender, EventArgs e) 
    { 

     lblTime.Text = sw.ElapsedTime; 


    } 
} 

我敢肯定,我失去了一些东西或做一些愚蠢的事,但我所有的谷歌赋还没有导致我的答案。提前致谢。

+0

当你说标签没有改变,它有没有值?还是它有一个初始值,但价值没有得到更新? –

+0

我将标签的文本属性设置为00:00:00 –

回答

3

单击“开始”按钮后,您只能指定一次变量elapsedTime的值。稍后,您尝试在timer_Tick方法中读取它的值(使用ElapsedTime属性),但不要分配新值。尝试是这样的:

public String ElapsedTime 
    { 
     get 
     { 
      TimeSpan ts = sw.Elapsed; 
      return String.Format("{0:00}:{1:00}:{2:00}", 
     ts.Hours, ts.Minutes, ts.Seconds/10); 
     } 
    } 
+0

谢谢!我已经将我的课程中的代码更改为低版本,但它似乎仍未更新。 'public String ElapsedTime { get { TimeSpan ts = sw.Elapsed; return String.Format(“{0:00}:{1:00}:{2:00}”, ts.Hours,ts.Minutes,ts.Seconds/10); } } public void StartClock() { sw.Start(); }' –

+0

“timer_Tick”函数是否被调用? :)如果是的话,看看d.moncada anserw。它可能是另一个线程尝试更新GUI的问题。请注意,只有GUI线程才能修改GUI组件。 – Valker

+0

哎!再次感谢! –

0

退房this,我认为发生在另一个线程的计时器滴答事件,即不允许更新UI,链接显示的解决方案取决于您所使用的.NET版本。

0

尝试以下

timer.Elapsed += OnTimedEvent; 
timer.Interval = 1000; 
timer.Enabled = true; 
sw.StartClock(); 

添加以下方法:

private static void OnTimedEvent(Object source, ElapsedEventArgs e) 
    { 
     lblTime.Text = string.Format("{0:HH:mm:ss.fff}",e.SignalTime); 
    } 
1

这是因为elapsedTime设置一次,之后再也没有更新。

public String ElapsedTime 
{ 
    get 
    { 
     return String.Format("{0:00}:{1:00}:{2:00}", sw.Elapsed); 
    } 
} 

这应该解决它。所以elapsedTime声明和初始化是没有用的,可以拆卸:

public class CStopWatch 
{ 
    Stopwatch sw = new Stopwatch(); 

    public String ElapsedTime 
    { 
     get 
     { 
      return String.Format("{0:00}:{1:00}:{2:00}", sw.Elapsed); 
     }    
    } 

    public void StartClock() 
    { 
     sw.Start(); 
    } 

    public void StopClock() 
    { 
     sw.Stop(); 
    } 
} 
0

的问题是,你居然不更新elapsedTime变量。你可以改用你的StopwatchElapsedTime属性:

public String ElapsedTime 
{ 
    get 
    { 
     return string.Format("{0:00}:{1:00}:{2:00}", sw.Elapsed.Hours, sw.Elapsed.Minutes, sw.Elapsed.Seconds/10); 
    } 
} 

或等价(C#6.0):

public String ElapsedTime => $"{sw.Elapsed.Hours:00}:{sw.Elapsed.Minutes:00}:{sw.Elapsed.Seconds/10:00}"; 
1

我相信有一些问题,你目前的执行情况。更新您的WinForms代码隐藏,以便在设置Interval后发生StartClock。此外,如果Timer正在另一个线程上发生,您将需要Invoke控制权。最后,只要Tick发生,您就需要更新ElapsedTime

public partial class Form1 : Form 
{ 
    CStopWatch sw = new CStopWatch(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnStart_Click(object sender, EventArgs e) 
    { 
     timer.Interval = 1000; 
     timer.Enabled = true; 

     lblTime.Text = sw.StartClock(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void timer_Tick(object sender, EventArgs e) 
    { 
     UpdateElapsedTime(); 

     if (lblTime.InvokeRequired) 
     { 
      lblTime.Invoke(new MethodInvoker(() => 
      { 
       lblTime.Text = sw.ElapsedTime; 
      })); 
     } 
    } 
} 

然后,您可以更新您的CStopWatch类以包含UpdateElapsedTime方法。

public class CStopWatch 
{ 
    private Stopwatch sw = new Stopwatch(); 
    private DateTime startTime; 
    private DateTime stopTime; 
    private String elapsedTime; 

    public String ElapsedTime 
    { 
     get 
     { 
      return elapsedTime; 
     } 
    } 

    public String StartClock() 
    { 
     sw.Start(); 

     UpdateElapsedTime(); 

     return ElapsedTime; 
    } 

    public void UpdateElapsedTime() 
    { 
     TimeSpan ts = sw.Elapsed; 
     ElapsedTime = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds/10); 
    } 

    public void StopClock() 
    { 
     sw.Stop(); 
    } 
} 
相关问题