隐藏表单,切换到第二个表单,关闭第二个表单并取消隐藏第一个表单

时间:2013-06-25 00:36:28

标签: c# winforms

我看了所有建议的答案,似乎没有什么适合我正在寻找的东西。我想从我的主窗体调用第二个窗体,在第二个窗体处于活动状态时隐藏我的主窗体,然后在第二个窗体关闭时取消隐藏主窗体。基本上我想在两种形式之间“切换”。

到目前为止,我有:

以我的主要形式:

private void countClick(object sender, EventArgs e)
{
    this.Hide(); 
    subForm myNewForm = new subForm();
    myNewForm.ShowDialog();
}

以我的第二种形式:

private void totalClick(object sender, EventArgs e)
{
    this.Close();
}

如何显示主要表单?

5 个答案:

答案 0 :(得分:2)

ShowDialog打开您的辅助表单作为模态对话框,这意味着MainForm的代码执行将在该点停止,并且您的辅助表单将具有焦点。所以你需要做的就是在ShowDialog调用之后放一个this.Show

从上面链接:

  

您可以使用此方法在应用程序中显示模式对话框。调用此方法时,直到关闭对话框后才会执行其后面的代码。

private void countClick(object sender, EventArgs e)
{
    this.Hide(); 
    subForm myNewForm = new subForm();
    myNewForm.ShowDialog();
    this.Show();
}

答案 1 :(得分:1)

让我们在Form1中点击一个按钮来显示Form2

 Form2 frm2 = new Form2();
 frm2.Activated += new EventHandler(frm2_Activated); // Handler when the form is activated
 frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed); // Hander when the form is closed
 frm2.Show();

现在,这个是显示Form2Activated隐藏调用表单的时候,在这种情况下是Form1

    private void frm2_Activated(object sender, EventArgs e)
    {
        this.Hide(); // Hides Form1 but it is till in Memory
    }

Form2Closed时,Unhide Form1

   private void frm2_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Show(); // Unhide Form1
    }

答案 2 :(得分:1)

这很难正确完成。问题是你必须避免没有可以获得焦点的窗口。 Windows窗口管理器将被强制查找另一个窗口以提供焦点。那将是另一个应用程序的窗口。你的窗户将在它后面消失。

在您现有的代码段中就是这种情况,您在显示对话框之前隐藏了主窗口。 通常结果没问题,除非对话创建缓慢。当对话框关闭时肯定会发生。

所以你需要做的是在显示对话框之后隐藏你的窗口并在对话框关闭之前再次显示。这需要技巧。它们看起来像这样:

private void countClick(object sender, EventArgs e)
{
    this.BeginInvoke(new Action(() => this.Hide()));
    using (var dlg = new subForm()) {
        dlg.FormClosing += (s, fcea) => { if (!fcea.Cancel) this.Show(); };
        if (dlg.ShowDialog() == DialogResult.OK) {
            // etc...
        }
    }
}

BeginInvoke()调用是在ShowDialog()方法运行后运行代码的技巧。因此,在显示对话框窗口后确保隐藏窗口。对话框的FormClosing事件用于在对话框关闭之前使窗口再次可见。

答案 3 :(得分:0)

如果您在同一个名称空间中工作,则可以使用mainform或您给出的"主表单"的名称来获取上下文,请尝试:

mainform.show();

答案 4 :(得分:0)

您需要找到一些方法将对主窗体的引用传递给第二个窗体单击事件处理程序。

您可以通过将表单设置为第二个表单类的成员变量或通过事件参数传递它来执行此操作。