将值从一个地方传递到另一个地方

时间:2016-03-26 18:27:51

标签: c#

这是我第一次尝试用任何语言学习课程。我正在尝试创建一个停止监视的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;


    }
}

我确定我错过了一些东西或做了一些愚蠢的事情,但我所有的谷歌都没有引导我找到答案。提前谢谢。

6 个答案:

答案 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}";