关闭窗体并在指定时间内未单击按钮时打开第二个窗体



我正在使用两个Windows表单应用程序:表单1和表单2。窗体 2 是运行时显示的第一个窗体,它提示用户通过单击按钮启动窗体 1。目标是,如果在几秒钟内未单击该按钮,则此窗体将关闭并打开窗体 1。

我认为我的代码运行最佳,但当我以多种方式对其进行测试时并非如此。第一次测试,等待 5 秒钟而不按开始按钮,Form 1 打开。但是,当我单击开始按钮时,表单 1 打开,并在 5 秒内打开另一个表单 1。这并不完全是我所期望的。我只想打开一个表格 1。

我的代码如下所示:

定时器 t2 = 新定时器((; 私有布尔值开始按钮被点击 = 假;

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

我不确定我是否遗漏了重要的部分,但从测试结果来看,肯定缺少一些东西。

我认为你说的东西与你的代码不同。假设你的意思是你所说的,那么你在这里的if语句应该是相反的:

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 的顺序可以在这里看到,如果您有兴趣,可以查看,但重要的一点是,当打开第一个窗体 Form 2 时会调用 Load(( 方法。这将从处理程序的计时器开始。

即使用户随后单击,一旦他们到达处理程序("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();
}

您还可以改进其他部分来重构并始终如一地隐藏/不隐藏,但我认为这解决了您的问题。

btnStart_Click中单击按钮时,您可能需要停止计时器。

我可以看到的是,当Form2加载到Form2_Load中时,计时器无论如何都会启动。因此,如果单击按钮,则需要停止计时器,否则它将按照设定的间隔触发。

最新更新