Trying to create stopwatches that will display in textboxes but I am getting a " does not contain a definition" error.

ShannonCallahan
ShannonCallahan used Ask the Experts™
on
Hello!

What I am looking for:

When my main form loads, I want 15 stopwatches created and 15 textbox.text's to be assigned to each stopwatch. These textboxes will display the current time of each timer after it is started:

           
public void Form1_Load(object sender, EventArgs e)
        {
            StopWatchCreate();
        }
        
        public void StopWatchCreate()
        {
            Stopwatch stopwatch1 = new Stopwatch();
            TimerTextBox1.Text = stopwatch1.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch2 = new Stopwatch();
            TimerTextBox2.Text = stopwatch2.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch3 = new Stopwatch();
            TimerTextBox3.Text = stopwatch3.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch4 = new Stopwatch();
            TimerTextBox4.Text = stopwatch4.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch5 = new Stopwatch();
            TimerTextBox5.Text = stopwatch5.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch6 = new Stopwatch();
            TimerTextBox6.Text = stopwatch6.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch7 = new Stopwatch();
            TimerTextBox7.Text = stopwatch7.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch8 = new Stopwatch();
            TimerTextBox8.Text = stopwatch8.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch9 = new Stopwatch();
            TimerTextBox9.Text = stopwatch9.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch10 = new Stopwatch();
            TimerTextBox10.Text = stopwatch10.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch11 = new Stopwatch();
            TimerTextBox11.Text = stopwatch11.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch12 = new Stopwatch();
            TimerTextBox12.Text = stopwatch12.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch13 = new Stopwatch();
            TimerTextBox13.Text = stopwatch13.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch14 = new Stopwatch();
            TimerTextBox14.Text = stopwatch14.Elapsed.ToString("hh\\:mm\\:ss");
            Stopwatch stopwatch15 = new Stopwatch();
            TimerTextBox15.Text = stopwatch15.Elapsed.ToString("hh\\:mm\\:ss");
        }

Open in new window


After a button click I want the corresponding stopwatch to start and the textbox.text to display the current timer. The issue I am running into is under the button clock function:

   
public void button1_Click(object sender, EventArgs e)
        {
            Form1.stopwatch1.Start();
        }

Open in new window

but stopwatch1 is giving the error: 'TaskTracker.Form1' does not contain a definition for 'stopwatch1'

Thank you for your help with this!
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Sam JacobsDirector of Technology Development, IPM
Commented:
Put the initialization of the stopwatches inside the class, before the constructor:
    public partial class Form1 : Form
    {
        Stopwatch stopwatch1 = new Stopwatch();
        Stopwatch stopwatch2 = new Stopwatch();
        etc ...

        public Form1()
        {
            InitializeComponent();

        }
etc...

Open in new window


Then remove the Form1. when you start the stopwatches.
 
       private void button1_Click(object sender, EventArgs e)
        {
            stopwatch1.Start();
            stopwatch2.Start();
            etc.
        }

Open in new window

Most Valuable Expert 2018
Distinguished Expert 2018

Commented:
Your stopwatches are not properties on the form - they're local variables that are declared within your StopWatchCreate function, so they're only available in that function.

You need to declare them at the class level (the form level in your case). Something like so;

Class Form1
{
private Stopwatch stopwatch1;
private Stopwatch stopwatch2;
private Stopwatch stopwatch3;

    public void StopWatchCreate() 
    {
        TimerTextBox1.Text = stopwatch1.Elapsed.ToString("hh\\:mm\\:ss");
        ...
    }        
}

Open in new window

Author

Commented:
OK. I added the Stopwatch at the class level:

public partial class Form1 : Form
    {
        Stopwatch stopwatch1 = new Stopwatch();

Open in new window


And I have the textbox text set on load of Form1:

        
public void Form1_Load(object sender, EventArgs e)
        {
            TimerTextBox1.Text = stopwatch1.Elapsed.ToString("hh\\:mm\\:ss");
        }

Open in new window


And my start button function:

public void button1_Click(object sender, EventArgs e)
        {
            stopwatch1.Start();
        }

Open in new window


The program will run, but the TimerTextBox1.text does not change?
OWASP Proactive Controls

Learn the most important control and control categories that every architect and developer should include in their projects.

Most Valuable Expert 2018
Distinguished Expert 2018

Commented:
OK. You're trying to set the textbox once only - when the form first loads.

You won't have started the stopwatch by this time, and even if you had, it won't constantly change the textbox as that only happens when you first load the form.

If you're wanting to constantly update the textbox, then you're going to need to thread the application somehow, and constantly poll the timer for updates. If you don't do this on a thread (background worker etc), then your UI will just lock.

The general approach you probably need is this:

declare the stopwatch at the class level.
start the stopwatch on form load
constantly poll the stopwatch and update the textbox from a background thread.
Director of Technology Development, IPM
Commented:
You can:
- place a Timer control on the form,
- set the Interval to 1000 (ms.), and
- set Enabled to True.

Then move the stopwatch elapsed code to the timer Tick event:
        private void timer1_Tick(object sender, EventArgs e)
        {
            TimerTextBox1.Text = stopwatch1.Elapsed.ToString("hh\\:mm\\:ss");
            TimerTextBox2.Text = stopwatch2.Elapsed.ToString("hh\\:mm\\:ss");
            etc...
        }

Open in new window

Author

Commented:
Thank you both, Sam and Chris, for your time and assistance!

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial