c#打开一个新窗体然后closures当前窗体?

例如,假设我在表单1中,那么我想:

  1. 打开表单2(从表单1中的一个button)
  2. closures表格1
  3. 关注表单2

史蒂夫的解决scheme不起作用。 当调用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(); } 

试着做这个…

 { this.Hide(); Form1 sistema = new Form1(); sistema.ShowDialog(); this.Close(); } 

这个问题的生命线:

Application.Run(new Form1()); 这可能可以在你的program.cs文件中find。

这一行指示form1处理消息循环 – 换句话说,form1负责继续执行应用程序 – 当form1closures时,应用程序将被closures。

有几种方法可以处理这个问题,但是所有这些方式都不能closuresform1。
(除非我们将项目types更改为Windows窗体应用程序以外的其他项目)

我认为最容易的就是创造3种forms:

  • form1 – 将保持不可见状态并充当pipe理员,如果需要,可以将其分配为处理托盘图标。

  • form2 – 将有button,点击时将closuresform2并打开form3

  • form3 – 将具有需要打开的其他表单的angular色。

这里是一个示例代码来实现这一点:
(我还添加了一个例子来closures从第三种forms的应用程序)

 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. } } 

注意:使用面板或dynamic加载用户控件是更具学术性和更好的行业生产标准 – 但在我看来,你只是试图推断事情的工作原理 – 为此目的,这个例子是更好的。

现在这个原则被理解了,我们只用两种forms来尝试:

  • 第一种forms将像前一个示例一样担当pipe理者的angular色,但也将呈现第一个屏幕 – 所以它不会被隐藏起来。

  • 第二种forms将扮演显示下一个屏幕的angular色,通过点击一个button将closures应用程序。

  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(); } } 

如果你改变了前面的例子 – 从项目中删除form3。

祝你好运。

你没有具体的,但它看起来像你试图做我的Win窗体应用程序做什么:从login表单开始,然后成功login后,closures该表单,并把焦点放在主窗体。 以下是我如何做到这一点:

  1. 使创build窗体成为可能; 这是我的Program.cs的样子:

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

     public bool IsLoggedIn { get; set; } 
  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; } 

没有成功login? 退出应用程序。 否则,用frmMain进行。 由于它是启动窗体,当它closures时,应用程序结束。

 private void buttonNextForm(object sender, EventArgs e) { NextForm nf = new NextForm();//Object of the form that you want to open this.hide();//Hide cirrent form. nf.ShowModel();//Display the next form window this.Close();//While closing the NextForm, control will come again and will close this form as well } 

在form1中使用这个代码片段。

 public static void ThreadProc() { Application.Run(new Form()); } private void button1_Click(object sender, EventArgs e) { System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc)); t.Start(); this.Close(); } 

我从这里得到这个

我认为这是更容易:)

  private void btnLogin_Click(object sender, EventArgs e) { //this.Hide(); //var mm = new MainMenu(); //mm.FormClosed += (s, args) => this.Close(); //mm.Show(); this.Hide(); MainMenu mm = new MainMenu(); mm.Show(); } 

其他答案已经描述了许多不同的方法。 然而,其中许多涉及ShowDialog()form1保持打开,但隐藏。 在我看来,最好和最直观的方法是简单地closuresform1 ,然后从外部位置创buildform2 (即不是从这两个表单中的任何一个)。 在Main中创buildform1的情况下, form2可以简单地使用Application.Run创build,就像之前的form1一样。 以下是一个示例场景:

我需要用户input他们的凭据,以便我以某种方式validation它们。 之后,如果authentication成功,我想向用户显示主应用程序。 为了做到这一点,我使用两种forms: LogingFormMainFormLoginForm有一个标志,用于确定authentication是否成功。 然后使用此标志决定是否创buildMainForm实例。 这两种forms都不需要了解其他forms,两种forms都可以优雅地打开和closures。 这是这个代码:

 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()); } } } 

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

在Form1上,我有一个名为Button1的button,在它的点击选项中写下面的代码:

 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(); } 

希望这段代码能帮助你

 //if Form1 is old form and Form2 is the current form which we want to open, then { Form2 f2 = new Form1(); this.Hide();// To hide old form ie Form1 f2.Show(); } 

此代码可以帮助您:

 Master frm = new Master(); this.Hide(); frm.ShowDialog(); this.Close(); 
  this.Visible = false; //or // will make LOgin Form invisivble //this.Enabled = false; // or // this.Hide(); Form1 form1 = new Form1(); form1.ShowDialog(); this.Dispose(); 

如果你有两种forms:frm_form1和frm_form2。下面的代码是用来打开frm_form2和closuresfrm_form1的(对于windows窗体应用程序)

  this.Hide();//Hide the 'current' form, ie frm_form1 //show another form ( frm_form2 ) frm_form2 frm = new frm_form2(); frm.ShowDialog(); //Close the form.(frm_form1) this.Close(); 

我会通过这样做来解决它:

 private void button1_Click(object sender, EventArgs e) { Form2 m = new Form2(); m.Show(); Form1 f = new Form1(); this.Visible = false; this.Hide(); }