【问题标题】:Show a form when another form is closed当另一个表单关闭时显示一个表单
【发布时间】:2018-05-01 11:32:13
【问题描述】:

单击一个按钮(在主窗体中),我会显示一个(第二个)窗体,它对存档文件进行一些解析(解压缩、提取、获取信息等)。完成此过程后,我关闭第二个(解析)表单并显示另一个(第三个)包含存档中已解析信息的表单。

点击回调如下所示:

private void ParseInputBackupButton_Click(object sender, EventArgs e)
{
    Form PBF = new ParseBackupForm();
    Form CBF = new CreateBackupForm();
    PBF.FormClosed += delegate
    {
        CBF.ShowDialog();
    };
    PBF.ShowDialog();
}

还有第二种形式:

private void ParseBackupForm_Load(object sender, EventArgs e)
{
    new Thread((ThreadStart)delegate
    {

        // parse and update form

        this.Invoke((MethodInvoker)delegate
        {
            this.Close();
        });

    }).Start();
}

问题是当第三个表单(CreateBackupForm)出现时,第二个表单(ParseBackupForm)没有关闭。他们都出现了。如果我不显示第三个表单,第二个表单就会关闭。

我做错了什么?

【问题讨论】:

    标签: c# winforms events


    【解决方案1】:

    当您在两个窗口上都调用ShowDialog 时,您不能一个接一个地调用它们吗?

    PBF.ShowDialog();
    CBF.ShowDialog();
    

    在 PBG 对话框关闭之前,不会进行第二次调用。

    编辑:第二个表单没有关闭的原因是您订阅了表单关闭时引发的事件,然后在该委托中调用 ShowDialog 阻止表单实际关闭。

    【讨论】:

    • 啊哈,这行得通。解决方案太简单了,我现在觉得很傻:)
    • 发生在我们所有人身上。
    【解决方案2】:

    据我所知,.ShowDialog() 是一个阻塞方法,所以会阻止另一个表单完成其关闭方法,直到该表单也关闭?

    很确定您可以使用.Show() 使表单可见而不阻塞?

    【讨论】:

    • CBF.Show() 有点工作,但我可以在表单(主要和第三个)之间切换。这是不可取的。当另一个表单处于活动状态/显示时,主表单应该是不可访问的。有没有办法让第三种形式 (CBF) 像一个对话框一样,尽管它是用Show() 调用的?
    【解决方案3】:

    您可以 BeginInvoke 调用CBF.ShowDialog();,从而不会阻塞 FormClosed 回调方法的完成和PBF 表单的关闭。

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多