我创建了一个简单的表单,当你运行它时弹出一个对话框,但我不能以编程方式关闭它。 任何人都可以帮我吗?
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);
在......睡觉之后(2000)我希望它关闭。 我试过了:
frm.close();frm.dispose();frm.visible = false;
提前致谢!
答案 0 :(得分:4)
你可以在形成类中使用这样的东西:
protected override async void OnLoad(EventArgs e)
{
base.OnLoad(e);
await Task.Delay(2000);
Close();
}
在OnLoad
方法内运行一个等待2000毫秒并关闭表单的任务。
答案 1 :(得分:3)
要在特定时间后关闭任何表单,您可以使用扩展方法
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();
答案 2 :(得分:2)
尝试以下方式。可能这不是更合适的方式。但我认为这将解决您的问题:
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();
}
答案 3 :(得分:1)
而不是使用frm.ShowDialog();
使用frm.Show();
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();
答案 4 :(得分:1)
要在一段时间后关闭对话框,您必须在对话框中添加一个计时器,如下所示:
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
或表单的构造函数中添加计时器。
答案 5 :(得分:1)
ShowDialog()会将表单显示为模式对话框。这意味着,调用将等到表单关闭。这也意味着您的Thread.Sleep()
将在表单关闭后执行。
非模态版本将是Show(),但这可能会导致问题,因为在睡眠期间,UI不会更新,因此它显示为冻结。您需要保持消息循环活跃。
for (int i=1; i<40; i++)
{
Application.DoEvents();
Thread.Sleep(50);
}
当你这样做时,你应该理解consequences of DoEvents()。恕我直言,清洁方法将是@Pikoh
提到的表格上的计时器还要注意以下代码
frm.close();frm.dispose();frm.visible = false;
在Dispose()之后,您不应再访问该表单,因为它已被销毁。也许这导致了崩溃。