如何以编程方式关闭对话框
本文关键字:对话框 方式关 编程 | 更新日期: 2023-09-27 18:06:12
我创建了一个简单的表单,当您运行它时弹出一个对话框,但我不能以编程方式关闭它。有人能帮我吗?
Label lb = new Label();
Form frm = new Form();
lb.Left = 100;
lb.Top = 44;
frm.Controls.Add(lb);
frm.ShowDialog();
System.Threading.Thread.Sleep(2000);
After .Sleep(2000)我想要它关闭。我试着:
frm.close();frm.dispose();frm.visible = false;
提前感谢!
你可以在你的form class里面使用这样的代码:
protected override async void OnLoad(EventArgs e)
{
base.OnLoad(e);
await Task.Delay(2000);
Close();
}
在OnLoad
方法中运行一个等待2000毫秒并关闭表单的任务。
要在指定时间后关闭任何表单,可以使用扩展方法
public static class Extension
{
public static async Task CloseAfterDelay(this Form form, int millisecondsDelay )
{
await Task.Delay( millisecondsDelay );
form.Close();
}
}
,在显示
之前将其命名为Label lb = new Label();
Form frm = new Form();
lb.Left = 100;
lb.Top = 44;
frm.Controls.Add(lb);
frm.CloseAfterDelay( 2000 );
frm.ShowDialog();
用frm.Show();
代替frm.ShowDialog();
ShowDialog()
将等待对话框关闭,然后继续执行代码。
编辑:
Label lb = new Label();
Form frm = new Form();
lb.Left = 100;
lb.Top = 44;
frm.Controls.Add(lb);
frm.Load += delegate (object o, EventArgs args)
{
Thread thread = new Thread(p =>
{
Thread.Sleep(TimeSpan.FromSeconds(2));
Action action = frm.Close;
Invoke(action);
});
thread.Start();
};
frm.ShowDialog();
按下面的方法试试。也许这不是更合适的方式。但我认为它会解决你的问题:
Label lb = new Label();
Form frm = new Form();
frm.Shown += Frm_Shown;
lb.Left = 100;
lb.Top = 44;
frm.Controls.Add(lb);
var result = frm.ShowDialog();
private void Frm_Shown(object sender, EventArgs e)
{
var frm = (Form)sender;
System.Threading.Thread.Sleep(3000);
frm.DialogResult = DialogResult.Cancel;
frm.Close();
}
ShowDialog()将把表单显示为模态对话框。这意味着,调用将等待表单关闭。这再次意味着您的Thread.Sleep()
将在表单已经关闭后执行。
非模态版本应该是Show(),但这可能会导致问题,因为在睡眠期间,UI不会更新,所以它看起来是冻结的。您需要保持消息循环活动。
for (int i=1; i<40; i++)
{
Application.DoEvents();
Thread.Sleep(50);
}
当你这样做的时候,你应该理解DoEvents()的后果。在我看来,更简洁的方法是在表单上添加计时器,就像@Pikoh
提到的那样。还要注意
后面的代码frm.close();frm.dispose();frm.visible = false;
在Dispose()之后你不应该再访问表单,因为它已经被销毁了。
要在一段时间后关闭对话框,必须在对话框表单中添加计时器,如下所示:
private void Form2_Load(object sender, EventArgs e)
{
Timer tim = new Timer();
tim.Interval = 2000;
tim.Tick += new EventHandler(tim_Tick);
tim.Enabled = true;
}
void tim_Tick(object sender, EventArgs e)
{
this.Close();
}
你可以在你的Form_Load
或者你的表单的构造函数中添加你的定时器