【问题标题】:Passing values from one place to another将值从一个地方传递到另一个地方
【发布时间】:2016-03-26 18:27:50
【问题描述】:

这是我第一次尝试学习任何语言的课程。我正在尝试创建一个作为秒表的 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;


    }
}

我确定我错过了什么或做了一些愚蠢的事情,但我所有的谷歌 fu 还没有让我找到答案。提前致谢。

【问题讨论】:

  • 当你说标签没有变化时,它有没有价值?还是它有一个初始值,但该值没有更新?
  • 我将标签的文本属性设置为 00:00:00

标签: c#


【解决方案1】:

在单击开始按钮后,您只需为变量 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);
        }
    }

【讨论】:

  • 谢谢!我已经将我班级中的代码更改为如下,但它似乎仍然没有更新。 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(); }
  • 是否调用了“timer_Tick”函数? :) 如果是,请查看 d.moncada anserw。另一个线程尝试更新您的 GUI 可能会出现问题。请注意,只有 GUI 线程可以修改 GUI 组件。
  • 明白了!再次感谢!
【解决方案2】:

这是因为 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();
    }
}

【讨论】:

    【解决方案3】:

    我认为您当前的实施存在一些问题。更新您的 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();
        }
    }
    

    【讨论】:

      【解决方案4】:

      查看this,我认为计时器滴答事件发生在另一个线程上,不允许更新 ui,链接显示解决方案取决于您使用的 .net 版本。

      【讨论】:

        【解决方案5】:

        试试下面的

        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);
            }
        

        【讨论】:

          【解决方案6】:

          问题在于您实际上并没有更新您的 elapsedTime 变量。您可以改为在 ElapsedTime 属性中使用您的 Stopwatch

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

          【讨论】:

            猜你喜欢
            • 2019-03-20
            • 2019-03-12
            • 2019-03-02
            • 1970-01-01
            • 2013-01-18
            • 2017-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多