Avatar of ShannonCallahan
ShannonCallahan
 asked on

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

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!
C#

Avatar of undefined
Last Comment
ShannonCallahan

8/22/2022 - Mon
SOLUTION
Sam Jacobs

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Chris Stanyon

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

ShannonCallahan

ASKER
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?
Chris Stanyon

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.
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
ASKER CERTIFIED SOLUTION
Sam Jacobs

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
ShannonCallahan

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