【问题标题】:How i can open a form and close it by one button [closed]我如何打开表单并通过一个按钮将其关闭[关闭]
【发布时间】:2018-12-30 17:36:15
【问题描述】:

我打开了一个表单,但我无法使用 same 按钮关闭它。我怎么能做到这一点? 我尝试这样做:

...
{
    var openform = new Form2();

    if (openform != null) openform.Show(); 
    else openform.Hide();
}

【问题讨论】:

  • 如果openformnull,你怎么称呼hide 呢?
  • 使 openform 成为成员而不是局部变量
  • 只取一个全局变量,比如 isOpen 并在打开时设置它并在关闭前检查它。 isOpen =假; { Form2 openform = new Form2(); if (!isOpen&&openForm!=null) { openform.Show(); } else { if(openForm!=null) openform.Hide(); } }

标签: c# winforms


【解决方案1】:

看来你必须实现以下逻辑:

  1. 如果有一个打开 Form2 实例,关闭
  2. 否则创建显示新的Form2实例。

如果是您的情况,我们应该首先寻找打开的Form2 实例;然后才使用new 创建它(如果需要)

  using System.Linq;

  ... 

  // Search: do we have opened Form2 instances?
  Form2 openform = Application
    .OpenForms        // among all opened forms 
    .OfType<Form2>()  // of type Form2
    .LastOrDefault(); // in case we have several instances, let's choose the last one

  if (null == openform) {   // no Form2 instance has been found
    openform = new Form2(); 

    openform.Show();
  }   
  else {                    // Instance (openform) has been found 
    openform.Close(); // Or openform.Hide();   
  }

【讨论】:

  • 感谢它开始工作的帮助
  • @Marcin:不客气!
【解决方案2】:

也许这样的事情会帮助你:

Form2 openform = new Form2();
if (Application.OpenForms.OfType<Form2>().Count() > 0)
    openform.Hide();

openform.Show();

虽然我没有完全理解您的问题的上下文 - 您可能需要调整代码。您也可以查看How to check if a windows form is already open, and close it if it is?

【讨论】:

    【解决方案3】:
    private Form2 form2;
    
    private void button1_Click(object sender, EventArgs e)
    {
        if (form2 == null || form2.IsDisposed)
        {
            // Either no form has been created or the last one created has been closed.
            form2 = new Form2();
            form2.Show();
        }
        else
        {
            form2.Close();
        }
    }
    

    如果你喜欢空传播:

    if (form2?.IsDisposed == false)
    {
        form2.Close();
    }
    else
    {
        // Either no form has been created or the last one created has been closed.
        form2 = new Form2();
        form2.Show();
    }
    

    【讨论】:

      【解决方案4】:

      使用 bool 变量作为打开按钮,就像下面一样,并使 openform 全局化。

      var openform = new Form2();      // it must be defined out 
      

      方法和类内作为全局变量。

      private static bool isOpen = true; 
      

      在按钮内点击方法

      if (isOpen) openform.Show();
      else openform.Hide();
      
      isOpen = !isOpen;
      

      测试代码

      public partial class Form2 : Form
      {
          public Form2() => InitializeComponent();
      
          Form1 openForm = new Form1();
          private static bool isOpen = true;
      
          private void button1_Click(object sender, EventArgs e)
          {
              if (isOpen) openForm.Show(); 
              else openForm.Hide(); 
      
              isOpen = !isOpen;
          }
      }
      

      检查这个测试。 https://youtu.be/o9I77dhEvYg

      【讨论】:

      • 为什么需要 isOpen 变量?只要您打开ShowHide 的文档并阅读备注...
      • 你没有明白。打开文档并阅读备注部分。在部分中您会发现,当您调用ShowHide 时,Visible 属性被切换。所以你不需要isOpen 变量——你可以使用openform.Visible。如果您非常仔细地阅读注释,您会发现调用这些方法等同于设置 Visible 属性。所以你的代码可以被最小化为一行:openform.Visible != openform.Visible
      • 您可以将 openform.visible 分配给 isOpen 第一次检查它也可以与 isOpen 变量一起使用,感谢您进行更多清除。
      • isOpen 如果是私有的,则不是全局静态,因为除了类之外没有人可以看到它
      【解决方案5】:

      我认为如果其他表单像 windows 中的所有其他表单一样关闭,操作员会更直观:按关闭按钮,单击右上角的十字,选择 ALT-F4 等。

      但是,如果你真的想从你的主窗体中关闭另一个窗体,你不应该只是关闭它,而是应该很好地询问另一个窗体是否可以自行关闭。这样您就可以让其他表单向操作员询问一些问题,例如询问是否需要保存更改的项目。

      private Form myForm = null;
      
      public void OnButton1_Clicked(object sender, ...)
      {
          if (this.myform == null)
          {   // not shown yet. Show it now:
              this.myForm = new Form2()
              this.myForm. properties = ...
      
              // make sure I get notified if the Form closes in any way:
              this.myForm.Closed += onMyFormClosed;
              // show the form
              this.myform.Show(this);
          }
          else
          {   // ask the form nicely to close itself
              this.CloseForm(); 
              // this might (or might not) lead to the event Form.Closed
          }
      }
      
      private void OnMyFormClosed(object sender, ...)
      {
           if (!object.ReferenceEquals(sender, this.myForm))
           {    // someone else is closed. I have nothing to do with this
                return;
           }
      
           // if here, my Form is closed. Save to Dispose and assign Null
           this.myForm.Dispose();
           this.myForm = null;
      }
      }
      
      public void ShowFo
      

      【讨论】:

        猜你喜欢
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 2013-05-07
        • 2014-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多