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