【问题标题】:Closing Forms in Windows Form App?在 Windows 窗体应用程序中关闭窗体?
【发布时间】:2013-09-03 09:45:38
【问题描述】:

我有两种表格,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 上的退出按钮时,它并没有停止调试。我应该怎么办?谢谢!

【问题讨论】:

  • 使用FormA A = new FormA();,您正在创建一个新表单,当您使用A.Show(); 时,您不会显示您隐藏的FormA (this.Hide();)

标签: c# winforms


【解决方案1】:
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();
  }
}

【讨论】:

    【解决方案2】:

    以对话模式打开第二个表单:

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

    【讨论】:

      【解决方案3】:

      lan,你的代码的问题是当你在formB中按btnReopenA时,你并没有回到旧的formA,而是打开一个新的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();
      }
      

      【讨论】:

        【解决方案4】:

        使用 Application.OpenForms[] 集合: Application.OpenForms["FormA"].Show()

        【讨论】:

          【解决方案5】:

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

          这是因为您从FromB 中打开了另一个FormA 实例

          我该怎么办?

          您需要在FormBShow 中获取FormA 的引用。

          我该怎么做?

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-08
            相关资源
            最近更新 更多