在C#中显示/隐藏主窗体

3

我正在开发一个程序,在form1上点击按钮会打开form2。然后我会隐藏form1直到form2关闭。我的问题是,我无法在form2关闭后显示form1。有什么办法可以解决这个问题吗?

        try
        {
            Form1.ActiveForm.Hide();
            AddGradeForm = new Form2(Form.NumberOfSelections);
            AddGradeForm.ShowDialog();
            MessageBox.Show(AddGradeForm.Result.ToString());
        }
        catch (Exception i)
        {
            Form1.ActiveForm.Hide();
            AddGradeForm.Dispose();
            AddGradeForm = new Form2(Form.NumberOfSelections);
            AddGradeForm.ShowDialog();
            MessageBox.Show(AddGradeForm.Result.ToString());
        }
        Form1.ActiveForm.Show();

错误:未处理的 NullReferenceException。对象引用未设置为对象的实例。


我认为 try...catch 不是你所想象的功能... - Thomas
我正在使用try..catch来处理之前创建的Form2。这是为了防止用户决定多次打开form2。我知道我应该在其他地方放置AddGradeForm.Dispose(),但我仍在进行结构化工作。 - Franz Payer
3个回答

7

这是因为没有活动的表单了,你已经隐藏了那个可以活动的表单。这会带来其他的副作用,比如你的应用将失去焦点。你需要做的是跟踪之前活动的表单,并在对话框关闭之前让它再次显示。就像这样:

        var prior = Form.ActiveForm;
        using (var dlg = new Form2()) {
            dlg.FormClosing += delegate { prior.Show(); };
            prior.Hide();
            if (dlg.ShowDialog() == DialogResult.OK) {
                MessageBox.Show("result");
            }
        }

你为什么使用FormClosing事件?dlg可以被其他处理程序阻止隐藏,但是之前仍然会显示。使用FormClosed事件不是更好吗? - dzendras
FormClosed太晚了。你的应用程序将失去焦点。如果对话框可以取消关闭,则需要为其提供另一个可订阅的事件。 - Hans Passant
+1 比我快一步,而我已经准备好了剪贴板上的代码 =) - Tergiver

0

这行代码

Form1.ActiveForm.Show();

应该是

Form1.Show();

请注意,如果出现异常,则可能不会调用它。如果您希望调用它,请将其包装在 finally 块中。
    try
    {
        Form1.ActiveForm.Hide();
        // ...
    }
    catch (Exception i)
    {
        // ...
    }
    finally
    {
        Form1.Show();
    }

我没有看到Form1的.Show()方法。这就是为什么我使用Form1.ActiveForm.Show();的原因。 - Franz Payer
你说得对,我没有注意到它是一个类型名称,只是假设它是一个实例。我给你点赞了。 - Willem van Rumpt

0

最后一行应该是:

Form1.Show();

Form1 没有这样的方法。 - Franz Payer
Form1是一种类型名称,不是指向窗体类的引用。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接