如何以编程方式关闭DialogBox

时间:2016-09-08 06:59:09

标签: c#

我创建了一个简单的表单,当你运行它时弹出一个对话框,但我不能以编程方式关闭它。 任何人都可以帮我吗?

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;

提前致谢!

6 个答案:

答案 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()之后,您不应再访问该表单,因为它已被销毁。也许这导致了崩溃。