Закрытие формы и открытие второй формы, если кнопка не нажата в течение указанного времени - PullRequest
0 голосов
/ 02 октября 2018

Я работаю с двумя приложениями для форм Windows: форма 1 и форма 2. Форма 2 - это первая форма, которая появляется во время выполнения, и она предлагает пользователю запустить форму 1 одним нажатием кнопки.Цель состоит в том, чтобы, если кнопка не была нажата в течение нескольких секунд, эта форма закрывается и открывается форма 1.

Я думал, что мой код работает оптимально, но это не так, когда я тестировал его несколькими способами.Первый тест, 5 секунд ожидания без нажатия кнопки запуска, открывается форма 1.Однако, когда я нажал кнопку «Пуск», открывается форма 1, и в течение 5 секунд открывается другая форма 1.Это не совсем то, что я ожидаю.Я хочу только одну форму 1, чтобы открыть.

Мой код такой, как показано:

Таймер t2 = новый таймер ();private bool startButtonWasClicked = false;

    public Form2()
    {
        InitializeComponent();
    }

    private void btnStart_Click(object sender, EventArgs e)
    {
        startButtonWasClicked = true;

        bool IsOpen = false;
        foreach(Form f in Application.OpenForms)
        {
            if(f.Text == "Form1")
            {
                IsOpen = true;
                f.Focus();
                break;
                //if the form is already open, it will focus on that form
            }
        }

        if (IsOpen == false)
        {
            Form1 f1 = new Form1();
            f1.Show();
        }
        //only one Form1 will be allowed when Start button is clicked.
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        //if the start button isn't pressed, in 5 seconds, Form2 closes and Form1 opens
        if (startButtonWasClicked)
        {
            t2.Interval = 5000;
            t2.Tick += new EventHandler(OnTimerTicker);
            t2.Start();
        }
        //else start button is clicked

    }

    private void OnTimerTicker(object sender, EventArgs e)
    {

            t2.Stop();
            Form1 f1 = new Form1();
            this.Hide();//"closes form 2 after 5 seconds and opens form 1
            f1.Show();

    }

Я не уверен, что мне не хватает важной части, но, судя по результатам теста, определенно чего-то не хватает.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вам может понадобиться остановить таймер при нажатии кнопки в btnStart_Click.

Что я вижу, это Таймер запускается в любом случае при загрузке Form2 в Form2_Load.Таким образом, если кнопка нажата, таймер необходимо остановить, иначе он сработает в соответствии с заданным интервалом.

0 голосов
/ 02 октября 2018

Я думаю, что вы говорите что-то другое, чем ваш код.Предполагая, что вы имеете в виду то, что говорите, тогда ваш if-stat здесь должен быть противоположным:

private void Form2_Load(object sender, EventArgs e)
    {
        //if the start button isn't pressed, in 5 seconds, Form2 closes and Form1 opens
        // Don't really need this because a user won't be able to click the button before the form loads
        if (!startButtonWasClicked)
        {
            t2.Interval = 5000;
            t2.Tick += new EventHandler(OnTimerTicker);
            t2.Start();
        }
        //else start button is clicked

    }

Порядок WinForms можно увидеть здесь , который вы можете посмотреть, есливас это интересует, но важно отметить, что метод Load () вызывается при открытии первой формы, формы 2.Это запускает таймер с обработчиком.

Даже если пользователь затем щелкает, как только он попадет в обработчик ('OnTimerTicker'), вам понадобится условие, чтобы проверить, следует ли открывать другую форму Form1.Что-то вроде:

private Timer t2 = new Timer();
        private bool startButtonWasClicked = false;

        private void Form2_Load(object sender, EventArgs e)
        {
            //if the start button isn't pressed, in 5 seconds, Form2 closes and Form1 opens
            if (!startButtonWasClicked)
            {
                t2.Interval = 5000;
                t2.Tick += new EventHandler(OnTimerTicker);
                t2.Start();
            }
            //else start button is clicked
        }



        private void button1_Click(object sender, EventArgs e)
        {
            startButtonWasClicked = true;
            // Stop the timer so it doesn't still run
            t2.Stop();

            bool IsOpen = false;
            foreach (Form f in Application.OpenForms)
            {
                if (f.Text == "Form1")
                {
                    IsOpen = true;
                    f.Focus();
                    break;
                    //if the form is already open, it will focus on that form
                }
            }

            if (IsOpen == false)
            {
                Form1 f1 = new Form1();
                f1.Show();
            }

            // Hide this window to be consistent
            this.Hide();
        }

        private void OnTimerTicker(object sender, EventArgs e)
        {
            if (startButtonWasClicked) { return; }
            t2.Stop();
            Form1 f1 = new Form1();
            this.Hide();//"closes form 2 after 5 seconds and opens form 1
            f1.Show();

        }

Есть и другие части, которые вы могли бы улучшить и в рефакторинге, а также скрывать / не скрывать последовательно, но я думаю, что это решает вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...