Как установить кнопку сброса для сброса всего, когда таймер и секундомер не работают?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace StopwatchTimer
{
    public partial class Form1 : Form
    {
        private static readonly Stopwatch watch = new Stopwatch();
        private long diff = 0, previousTicks = 0, ticksDisplayed = 0;

        public Form1()
        {
            InitializeComponent();

            richTextBox1.TabStop = false;
            richTextBox1.ReadOnly = true;
            richTextBox1.BackColor = Color.White;
            richTextBox1.Cursor = Cursors.Arrow;
            richTextBox1.Enter += RichTextBox1_Enter; ;

            UpdateTime();
        }

        private void RichTextBox1_Enter(object sender, EventArgs e)
        {
            btnStart.Focus();
        }

        private void UpdateTime()
        {
            richTextBox1.Text = GetTimeString(watch.Elapsed);
        }

        private string GetTimeString(TimeSpan elapsed)
        {
            string result = string.Empty;

            //calculate difference in ticks
            diff = elapsed.Ticks - previousTicks;

            if (radioButton1.Checked == true)
            { //counting up
                ticksDisplayed += diff;
            }
            else
            { //counting down
                ticksDisplayed -= diff;
            }

            if (ticksDisplayed < 0)
            {
                ticksDisplayed = 0;
            }

            //Make ticksDisplayed to regular time to display in richtextbox
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);

            result = string.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                ctimeSpan.Hours,
                ctimeSpan.Minutes,
                ctimeSpan.Seconds,
                ctimeSpan.Milliseconds);

            previousTicks = elapsed.Ticks;

            return result;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "START")
            {
                watch.Reset();
                watch.Start();
                UpdateTime();
                btnStart.Text = "STOP";
                timer1.Enabled = true;
            }
            else
            {
                watch.Stop();
                btnStart.Text = "START";
                btnPause.Text = "PAUSE";
                timer1.Enabled = false;
            }
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            watch.Reset();
            TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
            diff = 0;
            previousTicks = 0;
            ticksDisplayed = ctimeSpan.Ticks;
            trackBarHours.Value = 0;
            trackBarMinutes.Value = 0;
            trackBarSeconds.Value = 0;
            richTextBox1.Text = "00:00:00.000";
        }

        private void trackBarHours_Scroll(object sender, EventArgs e)
        {
            //get ticksDisplayed as TimeSpan
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
            //change only the hour
            TimeSpan htimeSpan = new TimeSpan(ctimeSpan.Days, trackBarHours.Value, ctimeSpan.Minutes, ctimeSpan.Seconds, ctimeSpan.Milliseconds);

            //set it to ticksDisplayed and update.
            ticksDisplayed = htimeSpan.Ticks;


            UpdateTime();
        }

        private void trackBarMinutes_Scroll(object sender, EventArgs e)
        {
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
            TimeSpan mtimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, trackBarMinutes.Value, ctimeSpan.Seconds, ctimeSpan.Milliseconds);

            ticksDisplayed = mtimeSpan.Ticks;


            UpdateTime();
        }

        private void trackBarSeconds_Scroll(object sender, EventArgs e)
        {
            TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
            TimeSpan stimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, ctimeSpan.Minutes, trackBarSeconds.Value, ctimeSpan.Milliseconds);

            ticksDisplayed = stimeSpan.Ticks;


            UpdateTime();
        }

        private void btnPause_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "STOP")
            {
                if (btnPause.Text == "PAUSE")
                {
                    btnPause.Text = "CONTINUE";
                    watch.Stop();
                    timer1.Enabled = false;
                }
                else
                {
                    btnPause.Text = "PAUSE";
                    watch.Start();
                    timer1.Enabled = true;
                }
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            UpdateTime();
        }
    }
}

Проблема заключается в событии щелчка кнопки сброса:

private void btnReset_Click(object sender, EventArgs e)
        {
            watch.Reset();
            TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
            diff = 0;
            previousTicks = 0;
            ticksDisplayed = ctimeSpan.Ticks;
            trackBarHours.Value = 0;
            trackBarMinutes.Value = 0;
            trackBarSeconds.Value = 0;
            richTextBox1.Text = "00:00:00.000";
        }

Пока таймер запускается после нажатия кнопки «Пуск», а затем нажав кнопку «Сброс», он работает нормально и сбросит таймер, и таймер начнет отсчет с 00: 00: 00 000

Но, изменяя значение трека / s / s перед нажатием кнопки «Пуск», а затем нажав кнопку «Сброс», он не переименует ее до 00: 00: 00.000, после чего, если я нажму на кнопку «Пуск», она начнется с последних изменений, которые я сделал с трекбары, даже если я первым нажал кнопку сброса.

Всего 1 ответ


Проблема здесь в событии btnReset_Click . Вы делаете следующее:

            TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
            ticksDisplayed = ctimeSpan.Ticks;

Таким образом, ctimeSpan будет использовать текущий trackBarHours.Value , trackBarMinutes.Value и trackBarSeconds.Value и установить его как ticksDisplayed и будет использоваться для следующего вычисления. Если вы хотите полностью восстановить время до «00: 00: 00.000», вам необходимо переписать вышеуказанный код как:

            ticksDisplayed = 0;

Есть идеи?

10000