C# 如何阻止windows窗体关闭但在单击X时隐藏?

C# 如何阻止windows窗体关闭但在单击X时隐藏?,c#,winforms,C#,Winforms,我正在尝试一个点击事件,它将打开另一个表单。我不希望用户能够关闭此窗口,因为再次执行click事件时会出现以下异常 System.ObjectDisposedException:'无法访问已处置的对象。 对象名称:“Form2.” 我不确定我是否正确地实现了这一点,或者是否有更好的方法来实现这一点 表格1 表格2 订阅并设置传递给处理程序的事件参数的属性。这将告诉运行时取消关闭事件 由于事件将被取消,您必须自己隐藏表单(当然要使用hide()) 有几种方法可以实现这一点 在FormClosi

我正在尝试一个点击事件,它将打开另一个表单。我不希望用户能够关闭此窗口,因为再次执行click事件时会出现以下异常

System.ObjectDisposedException:'无法访问已处置的对象。 对象名称:“Form2.”

我不确定我是否正确地实现了这一点,或者是否有更好的方法来实现这一点

表格1


表格2


订阅并设置传递给处理程序的事件参数的属性。这将告诉运行时取消关闭事件

由于事件将被取消,您必须自己隐藏表单(当然要使用
hide()


有几种方法可以实现这一点

在FormClosing事件中,隐藏表单并取消事件通常更有效,但这可能需要额外的逻辑

除非在创建表单时需要运行一些昂贵的代码,否则这可能无关紧要,只需允许表单正常关闭就更容易了

无论采用哪种方式,您都需要做的是向btnSearch处理程序中加入一些保护措施,以便它能够适当地响应表单状态
f

public Form2 f;
public void BtnSearch_Click(object sender, EventArgs e)
{
    if (f == null || f.IsDisposed || f.Disposing) f = new Form2(...);
    f.Show();
}

form2的实例应该在事件中创建



private void Btnsearch_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
    f.Show();
}

为什么不将表单的创建移到click处理程序中?“我不确定是否正确实现了这一点,或者是否有更好的方法来实现这一点。”您是否面临任何问题/异常,或者您只是在寻找代码审阅?@RezaAghaei-ObjectDisposedException似乎是OP的问题。有更好的方法。不要存储某个对象的实例,该对象肯定会在某个时候被处理。需要时创建一个新的。是否需要从创建新实例的窗体(类)访问该实例?将新实例分配给字段(或Form1的私有属性或用于管理UI对象创建/销毁的其他类)。表单和任何其他类一样是一个类:与任何其他类一样,当您知道某个实例注定要被处理时,您不能盲目地依赖它的实例。这是错误的部分:
public Form2 f=new Form2()。在
Btnsearch\u中单击
,创建Form2的新实例并显示它。仅此而已。这似乎并没有阻止OP看到的问题。在我看来,这是一个围绕
allowClose
值的逻辑问题。它确实阻止了OP的问题,但现在我们正在处理一个实例范围的表单(aka可以随时间创建多个实例),看起来它关闭了,但实际上从来没有关闭过。需要注意的是,此类表单必须通过
Form.Dispose
显式终止,并且可能会使用
Environment.exit
显式退出应用程序,否则最终可能会导致内存泄漏和永久不可见表单,这两种情况都不是好事(尽管无可否认,并不总是会导致问题)。
private void Form1_Closing(Object sender, CancelEventArgs e)
{
    this.Hide();
    e.Cancel = true;
}
public Form2 f;
public void BtnSearch_Click(object sender, EventArgs e)
{
    if (f == null || f.IsDisposed || f.Disposing) f = new Form2(...);
    f.Show();
}


private void Btnsearch_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
    f.Show();
}