c# - 在 C# 中的窗体之间切换

标签 c# forms showdialog

当我的程序的自动生成代码启动时,它会调用

Application.Run(new Form1());

并启动 Form1。我有另一种形式,我想切换到并同时关闭 Form1。问题是,如果我在用“Form.ShowDialog()”调用另一个窗体之前在 Form1 中使用“this.Close()”,则程序结束。如果我将它放在 ShowDialog 之后,那么它会一直在后台运行,直到我关闭 Form2,此时程序结束。

如何在关闭当前打开的框架的同时生成 Frame2 的副本?

编辑:我也尝试用 .Show() 调用 Frame2,但新框架会立即关闭。

最佳答案

以下解决方案如您所愿。

要尝试此示例代码,请在 Visual Studio 中创建一个新的 WinForms 应用程序(即文件 --> 新建项目,选择 Visual C# --> Windows 经典桌面并使用模板“Windows Forms App (.NET Framework)”) ,然后添加第二种形式。

确保两个表单分别命名为Form1Form2,然后修改生成的解决方案中的代码如下:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        (new Form2()).Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }
}

这是应用程序的入口点,修改如下:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Show first form and start the message loop
        (new Form1()).Show();
        Application.Run(); // needed, otherwise app closes immediately
    }

}

诀窍是使用不带参数的 Application.Run() 和 Application.Exit() 在您想要退出应用程序的位置。

现在,当您运行该应用程序时,Form1 将打开。单击 X(右上角),Form1 关闭,但出现 Form2。再次点击 X,表单关闭(也退出应用程序)。

除了将 Form2 的启动放入 FormClosed 事件中,您还可以创建一个按钮 Button1 来完成这项工作,但在那种情况下不要忘记通过 this.Close() 显式关闭按钮所属的表单:

    private void button1_Click(object sender, EventArgs e)
    {
        (new Form2()).Show(); this.Close();
    }

关于c# - 在 C# 中的窗体之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6121826/

相关文章:

c# - 使用泛型 T 确定编译器选择的重载

php - 通过php发送html表单数据到sql数据库(使用mysqli)

wpf - 父窗口后面的 ShowDialog()

css - 自动大小列取决于 css/angular 中多行的最大大小

javascript - 用于表单提交的自定义帖子字符串

.net - 如何在没有 ShowDialog() 的情况下等待表单关闭?

java - 安卓/Java : showDialog with arguments?

c# - 将 SQL 转换为 Linq 查询

c# - 如何对自己进行 Linq GroupJoin 以填充子/父属性?

c# - 将 ctrl+c 发送到 c# 中的 cmd.exe 进程