在Windows窗体应用程序中关闭窗体?

时间:2013-09-03 09:45:39

标签: c# winforms

我有两种形式,FormA和FormB。

FormA有两个按钮,一个用于打开FormB,另一个用于退出 FormB有一个按钮,用于关闭FormB并重新打开FormA。

我的代码是这样的:

public class FormA
{
    private void btnOpenformB_Click(System.Object sender, System.EventArgs e)
    {
        FormB B = new FormB();
        this.Hide();
        B.Show();
    }
    private void btnExit_Click(System.Object sender, System.EventArgs e)
    {
        this.Close();
    }
}

public class FormB
{
    private void btnReopenA_Click(System.Object sender, System.EventArgs e)
    {
        FormA A = new FormA();
        this.Close();
        A.Show();
    }
}

我的问题是当我单击FormB上的按钮重新打开FormA时,当我单击FormA上的退出按钮时,它不会停止调试。我该怎么办?谢谢!

5 个答案:

答案 0 :(得分:2)

public class FormA {
  private void btnOpenformB_Click(System.Object sender, System.EventArgs e) {
    FormB B = new FormB();
    this.Hide();
    B.Show(this);//Note we pass in the Owner here
  }
  private void btnExit_Click(System.Object sender, System.EventArgs e) {
    this.Close();
  }
}

public class FormB {
  private void btnReopenA_Click(System.Object sender, System.EventArgs e) {
    if(Owner!=null) Owner.Show();
    this.Close();
  }
}

答案 1 :(得分:1)

在对话框模式下打开第二个表单:

this.Hide();
B.ShowDialog();
this.Show();

答案 2 :(得分:1)

lan,您的代码存在的问题是,当您在formA中按btnReopenA时,您不会返回旧的formB,而是打开一个新的formA

避免这种情况的一种优雅方式是注册FormClosing事件

private void btnOpenformB_Click(System.Object sender, System.EventArgs e)
{
    FormB B = new FormB();
    B.FormClosing += b_FormClosing;
    this.Hide();
    B.Show();
}

  void b_FormClosing(object sender, FormClosingEventArgs e)
  {
     Show();
  }

或者,如果您不想处理事件,可以这样做:

public partial class FormB : Form
{
  private Form _frm;
  public FormB(Form frm)
  {
     _frm = frm;
     InitializeComponent();
  }

  private void btnReopenA_Click(System.Object sender, System.EventArgs e) {
       if(_frm!=null) _frm.Show();
       this.Close();
  }
}

并在创建formB时:

private void btnOpenformB_Click(System.Object sender, System.EventArgs e)
{
    FormB B = new FormB(this);
    this.Hide();
    B.Show();
}

答案 3 :(得分:0)

  

我的问题是当我单击FormB上的按钮重新打开FormA时,   当我单击FormA上的退出按钮时,它不会停止调试。

这是因为您从FormA

打开了FromB的另一个实例
  

我该怎么办?

您需要在FormAFormB中获得Show的引用。

  

我该怎么做?

    public class FormA
    {
        private void btnOpenformB_Click(System.Object sender, System.EventArgs e)
        {
            FormB B = new FormB();
            B.Closed+=OnFromBClosed; //Add this to handle FromB Closed event
            this.Hide();
            B.Show();
        }
        private void btnExit_Click(System.Object sender, System.EventArgs e)
        {
            this.Close();
        }

       //Show FormA again when FromB is closed
        protected void OnFromBClosed(object sender, EventArgs e)
        {
            this.Show();
        }

    }

public class FormB
{
    private void btnReopenA_Click(System.Object sender, System.EventArgs e)
    {
       // FormA A = new FormA(); remove this.
        this.Close();
       // A.Show();  and remove this
    }
}

答案 4 :(得分:0)

使用Application.OpenForms []集合: Application.OpenForms [ “备考”]。显示()