这是我第一次尝试用任何语言学习课程。我正在尝试创建一个停止监视的Windows窗体项目。我创建了一个具有启动秒表的StartClock方法的类,然后将经过的时间放入时间跨度变量中。然后我接受一个elapsedTime字符串并将其设置为等于带有时间跨度varibles的格式化字符串。代码如下。
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 :(得分: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);
}
}
答案 1 :(得分: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();
}
}
答案 2 :(得分:1)
我相信您当前的实施存在一些问题。更新您的WinForms代码隐藏,以便在设置StartClock
后发生Interval
。此外,如果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();
}
}
答案 3 :(得分:0)
签出this,我认为计时器刻度事件发生在另一个线程上,不允许更新ui,链接显示解决方案取决于您使用的.net版本。
答案 4 :(得分: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);
}
答案 5 :(得分:0)
问题是您实际上没有更新elapsedTime
变量。您可以使用Stopwatch
属性中的ElapsedTime
:
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}";