如何关闭当前表单然后在C#中打开主表单?

时间:2010-01-12 19:51:27

标签: c#

我可以使用以下代码打开第一个名为“ FieldReprogrammingSoftware ”的表单,并打开另一个名为“Setup”的表单。

            Setup fh = new Setup();
            fh.Show();
            this.Hide();

但是我似乎无法回到 FieldReprogrammingSoftware ,因为该名称甚至不是 Setup 代码中的一个选项。如果我尝试只输入 FieldReprogrammingSoftware ,我会收到错误消息:

  

名称'FieldReprogrammingSoftware'   在当前上下文中不存在

任何想法?

请记住,我是C#的菜鸟。

NVM,我刚刚发现,对于这个产品, FieldReprogrammingSoftware 表单可以保持打开状态,而 Setup 表单已经打开,所以我现在只是使用

        Setup fh = new Setup();
        fh.Show();
FieldReprogrammingSoftware 表单上的

this.close()

在设置表单上。上帝在VB中很容易做到

两种形式的命名空间都是FieldUpdate,这就是我的解决方案。

5 个答案:

答案 0 :(得分:4)

您必须将主窗体的实例传递给Setup或创建一个静态变量来保存主窗体。

您还可以订阅Setup表单已关闭事件,然后再次显示该表单。

喜欢这样

        Setup setupForm = new Setup();
        setupForm.Show();
        setupForm.FormClosed += (o,e) => this.Show();
        this.Hide();

编辑.NET 2.0

        Setup setupForm = new Setup();
        setupForm.Show();
        setupForm.FormClosed += new FormClosedEventHandler(setupForm_Closed);
        this.Hide();


 void setupForm_Closed(object sender, FormClosedEventArgs e)
        {
            this.Show();
        }

答案 1 :(得分:4)

在“设置”表单中,您可以使用:

private void button1_Click(object sender, EventArgs e)
{
    Application.OpenForms[0].Show();
    this.Hide(); // or this.Close();
}

这将再次显示第一个表格。 “0”是应用程序主窗体的索引。

答案 2 :(得分:4)

在您所描述的情况中,您希望恢复原始实例。您已使用this.hide隐藏表单。

显然你不想新建另一个实例,因为这会浪费资源;您需要做的是将初始实例存储在您可以从子表单获取的位置。

有几种方法可以做到这一点,但我很可能采用以下两种方法之一:

<强>的Singleton:

将您的主表单存储在单例中,这样当您需要将其恢复时,您可以参考存储的实例,而不是浪费地新建另一个实例。

public static class GlobalForms
{
    private MainForm _main;
    public MainForm Main
    {
        get
        {
            if (_main == null) _main = new MainForm();
            return _mainForm;
        }
    }

}

现在,当你需要MainForm时,你可以引用单例,而不是新建它。

Form mainInstance = GlobalForms.Main
mainInstance.Show();
//Do any other stuff for your main form.
this.Hide(); //Or this.Close();

这是延迟加载的,所以在第一次需要它之前它不会创建主窗体的实例。在此之后它将被保留,直到你再次需要它,除非你处理它,在这种情况下循环将再次开始。

打开第二个表单作为第一个表单的孩子:

Form otherForm = new OtherForm();
otherForm.Show(this); //This sets up the main form as the owner of this one for this call
this.Hide();

或者,如果您希望将OtherForm作为模态对话框打开(即,当此窗口打开时您无法与其他窗口交互),请执行otherForm.ShowDialog(this);

来自OtherForm:

this.Owner.Show();
this.Close();

或者,Stan R已经讨论了a neat idea using an event handler to catch the close event of the child form。虽然如果您有多个表单打开您的子表单,这可能会变得复杂,因此如果此表单是许多表单的通用对话框,则应谨慎使用此方法。

您还可以访问Application.OpenForms集合以获取当前在应用程序中打开的表单。您需要知道您希望激活的表单的索引。

每种方法都有其缺点。当然,您采用的路线将补充您的其他架构和设计实践,以便您的代码保持一致。

答案 3 :(得分:1)

如果您只需要暂时使用“设置”表单,则另一种方法是将表单作为对话框打开。

using(Setup fh = new Setup())
{
     this.Hide();
     fh.ShowDialog();
     this.Show();
}

答案 4 :(得分:0)

跟随你的心,让错误信息成为你的指南。

检查FieldProgrammingSoftware表单的命名空间,它位于代码文件的顶部,位于using语句的下方。有时,特别是在复制代码或从其他项目添加新表单时,很容易混合名称空间。

例如,如果您创建一个名为 WindowsApplication1 的新项目,则添加到项目中的所有新表单将自动继承该命名空间,并将 WindowsApplication1 作为其命名空间。如果您将另一个项目中的表单添加到现有项目中,它将使名称空间与其他项目保持一致。

如果您没有故意在代码中添加新的命名空间,这听起来不像您正在做的那样,请确保两者都匹配(或者两者都至少具有命名空间)。否则,要么添加新命名空间,要么单击未获得智能感知的对象的末尾,然后按 Ctrl。以查看VS是否可以为您找到对象命名空间。