C# 如何通过一个按钮打开和关闭窗体

C# 如何通过一个按钮打开和关闭窗体,c#,winforms,C#,Winforms,我打开一个表单,但不能用同一个按钮关闭它。我怎么能做到? 我尝试这样做: ... { var openform = new Form2(); if (openform != null) openform.Show(); else openform.Hide(); } 似乎您必须实现以下逻辑: 如果有打开的Form2实例,请将其关闭 否则,创建并显示新的Form2实例。 如果是您的情况,我们应该首先查找打开的Form2实例;只有在需要时才使用新的 using Sy

我打开一个表单,但不能用同一个按钮关闭它。我怎么能做到? 我尝试这样做:

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

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

似乎您必须实现以下逻辑:

如果有打开的Form2实例,请将其关闭 否则,创建并显示新的Form2实例。 如果是您的情况,我们应该首先查找打开的Form2实例;只有在需要时才使用新的

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

也许这样的东西可以帮助你:

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

openform.Show();
虽然我没有完全理解您问题的上下文,但您可能需要修改代码。你也可以检查这个

如果您喜欢空传播:

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

使用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;
    }
}
检查这个测试。

我认为,如果其他窗体与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

如果openform为null,您将如何调用它的hide?将openform设置为成员而不是局部变量只需获取一个全局变量,例如isOpen,并在打开时进行设置,然后在关闭前进行检查。isOpen=假;{Form2 openform=new Form2;if!isOpen&&openform!=null{openform.Show;}else{ifopenForm!=null openform.Hide;}感谢它开始提供的帮助work@Marcin:不客气!为什么需要等参变量?如果你打开或的文档并阅读备注…@Reniuz当它被检查为真时,它会像一个位一样工作,然后隐藏或显示窗体具有与openForm相同的瞬间,它在构造函数上实例化了一次。你没有得到它。打开文档并阅读备注部分。在第节中,您将发现,当您调用Show或Hide时,Visible属性被切换。因此,您不需要isOpen变量-您可以使用openform.Visible。若你们仔细阅读这些注释,你们会发现调用这些方法等同于设置Visible属性。因此,您的代码可以最小化为一行:openform.Visible!=openform.Visible。您可以首次将openform.Visible分配给isOpen检查它也可以与isOpen变量一起使用,这要感谢更多的清除。如果isOpen是私有的,则它不是全局静态的,因为除了类之外没有人可以看到它
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