如何以编程方式关闭对话框

本文关键字:对话框 方式关 编程 | 更新日期: 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或者你的表单的构造函数中添加你的定时器