Закрытие формы и открытие второй формы, если кнопка не нажата в течение указанного времени

120
7

Я работаю с двумя формами окон: форма 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();

}

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

спросил(а) 2018-10-02T06:48:00+03:00 1 год, 9 месяцев назад
1
Решение
55

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

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

}

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

ответил(а) 2018-10-02T07:43:00+03:00 1 год, 9 месяцев назад
39

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

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

ответил(а) 2018-10-02T10:59:00+03:00 1 год, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема