c#打开一个新表格然后关闭当前表格?

tnh*_*n07 70 c# forms winforms

例如,假设我在表单1然后我想:

  1. 打开表单2(从表单1中的按钮)
  2. 关闭表格1
  3. 专注于形式2

nih*_*que 168

史蒂夫的解决方案不起作用.调用this.Close()时,当前表单与form2一起处理.因此,您需要隐藏它并设置form2.Closed事件来调用this.Close().

private void OnButton1Click(object sender, EventArgs e)
{
    this.Hide();
    var form2 = new Form2();
    form2.Closed += (s, args) => this.Close(); 
    form2.Show();
}
Run Code Online (Sandbox Code Playgroud)

  • `form2.Closed + =(s,args)=> this.Close();`我可以知道这个语句是如何工作的?究竟是什么`(s,args)`是什么? (5认同)
  • 点网中的窗体中没有关闭事件.你能告诉我是FormClosed事件吗? (2认同)
  • 不隐藏第一个表单仍然保留它的记忆吗?我们如何释放该资源? (2认同)

Mon*_*ska 22

试着这样做......

{
    this.Hide();
    Form1 sistema = new Form1();
    sistema.ShowDialog();
    this.Close();
}
Run Code Online (Sandbox Code Playgroud)


Man*_*zor 14

其他答案已经描述了许多不同的方式.然而,他们中的许多人要么参与ShowDialog(),要么form1保持开放但隐藏.在我看来,最好和最直观的方法是简单地关闭form1然后form2从外部位置创建(即不是从这些形式中的任何一个内部创建).在form1创建的情况下Main,form2可以Application.Runform1以前一样简单地创建.这是一个示例场景:

我需要用户输入他们的凭据,以便我以某种方式对他们进行身份验证.之后,如果身份验证成功,我想向用户显示主应用程序.为了实现这一点,我使用了两种形式:LogingFormMainForm.在LoginForm具有确定认证是否成功与否的标志.然后使用该标志来决定是否创建MainForm实例.这些形式都不需要知道另一种形式,两种形式都可以优雅地打开和关闭.这是以下代码:

class LoginForm : Form
{
    bool UserSuccessfullyAuthenticated { get; private set; }

    void LoginButton_Click(object s, EventArgs e)
    {
        if(AuthenticateUser(/* ... */))
        {
            UserSuccessfullyAuthenticated = true;
            Close();
        }
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        LoginForm loginForm = new LoginForm();
        Application.Run(loginForm);

        if(loginForm.UserSuccessfullyAuthenticated)
        {
            // MainForm is defined elsewhere
            Application.Run(new MainForm());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


G.Y*_*G.Y 10

问题出在那条线上:

Application.Run(new Form1()); 您可以在program.cs文件中找到它.

此行表示form1将处理消息循环 - 换句话说,form1负责继续执行您的应用程序 - 当form1关闭时,应用程序将被关闭.

有几种方法可以解决这个问题,但所有这些方法都不会以某种方式关闭form1.
(除非我们将项目类型更改为Windows窗体应用程序以外的其他内容)

我认为最简单的方法是创建3种形式:

  • form1 - 将保持不可见并充当管理员,如果需要,您可以指定它来处理托盘图标.

  • form2 - 将有按钮,单击该按钮将关闭form2并将打开form3

  • form3 - 将具有需要打开的其他表单的角色.

这里有一个示例代码来完成:(
我还添加了一个示例来关闭第三个表单中的应用程序)

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1()); //set the only message pump to form1.
    }
}


public partial class Form1 : Form
{
    public static Form1 Form1Instance;

    public Form1()
    {
        //Everyone eveywhere in the app should know me as Form1.Form1Instance
        Form1Instance = this;

        //Make sure I am kept hidden
        WindowState = FormWindowState.Minimized;
        ShowInTaskbar = false;
        Visible = false;

        InitializeComponent();

        //Open a managed form - the one the user sees..
        var form2 = new Form2();
        form2.Show();
    }

}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var form3 = new Form3(); //create an instance of form 3
        Hide();             //hide me (form2)
        form3.Show();       //show form3
        Close();            //close me (form2), since form1 is the message loop - no problem.
    }
}

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1.Form1Instance.Close(); //the user want to exit the app - let's close form1.
    }
}
Run Code Online (Sandbox Code Playgroud)


注意:使用面板或动态加载用户控件更具学术性,更适合作为行业生产标准 - 但在我看来,您只是试图推断出事情是如何工作的 - 为此目的,这个例子更好.

现在理解这些原则让我们只用两种形式来尝试:

  • 第一个表单将扮演管理员的角色,就像前面的示例一样,但也会显示第一个屏幕 - 所以它不会被隐藏.

  • 第二种形式将扮演显示下一个屏幕的角色,单击按钮将关闭应用程序.


    public partial class Form1 : Form
    {
        public static Form1 Form1Instance;

        public Form1()
        {
            //Everyone eveywhere in the app show know me as Form1.Form1Instance
            Form1Instance = this;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Make sure I am kept hidden
            WindowState = FormWindowState.Minimized;
            ShowInTaskbar = false;
            Visible = false;

            //Open another form 
            var form2 = new Form2
            {
                //since we open it from a minimezed window - it will not be focused unless we put it as TopMost.
                TopMost = true
            };
            form2.Show();
            //now that that it is topmost and shown - we want to set its behavior to be normal window again.
            form2.TopMost = false; 
        }
    }

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1.Form1Instance.Close();
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您更改上一个示例 - 从项目中删除form3.

祝好运.


小智 6

你并不具体,但看起来你正试图在我的Win Forms应用程序中做我做的事情:从登录表单开始,然后在成功登录后,关闭该表单并将焦点放在主表单上.我是这样做的:

  1. 使frmMain成为创业形式; 这是我的Program.cs的样子:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在我的frmLogin中,创建一个初始化为false的公共属性,并且只有在成功登录时才设置为true:

    public bool IsLoggedIn { get; set; }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我的frmMain看起来像这样:

    private void frmMain_Load(object sender, EventArgs e)
    {
        frmLogin frm = new frmLogin();
        frm.IsLoggedIn = false;
        frm.ShowDialog();
    
        if (!frm.IsLoggedIn)
        {
            this.Close();
            Application.Exit();
            return;
        }
    
    Run Code Online (Sandbox Code Playgroud)

没有成功登录?退出应用程序.否则,继续使用frmMain.由于它是启动形式,当它关闭时,应用程序结束.


小智 -1

假设您有两个表单,第一个表单名称为 Form1,第二个表单名称为 Form2。您必须从 Form1 跳转到 Form2,在此输入代码。编写如下代码:

在 Form1 上,我有一个名为 Button1 的按钮,并在其单击选项上编写以下代码:

protected void Button1_Click(Object sender,EventArgs e)
{
    Form frm=new Form2();// I have created object of Form2
    frm.Show();
    this.Visible=false;
    this.Hide();
    this.Close();
    this.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

希望这段代码能帮助你