【问题标题】:How to stop windows form from closing but hide upon clicking the X?如何阻止 Windows 窗体关闭但在单击 X 时隐藏?
【发布时间】:2019-04-29 00:07:20
【问题描述】:

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

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

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

Form1


public Form2 f = new Form2();

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

Form2


private bool allowClose = false; 
private void Btnclose_Click(object sender, EventArgs e)
{
    allowClose = true;
    this.Hide();
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!allowClose)
        e.Cancel = true;
}

【问题讨论】:

  • 为什么不在点击处理程序中移动表单的创建?
  • '我不确定我是否正确地实现了这一点,或者有更好的方法来做到这一点。' 您是否面临任何问题/异常,或者您正在寻找只是为了代码审查?
  • @RezaAghaei - ObjectDisposedException 似乎是 OP 的问题。
  • 有更好的方法。不要存储在某个时候肯定会被丢弃的对象的instance。需要时创建一个新的。您是否需要从创建它的 Form(类)访问新实例?将 new 实例分配给 Field(或 Form1 的私有属性或用于管理 UI 对象创建/销毁的其他类)。 Form 与其他任何类一样是一个类:与任何其他类一样,当您知道该实例必然被处置时,您不能盲目地依赖它的实例。这是错误的部分:public Form2 f = new Form2();.
  • Btnsearch_Click 中,创建Form2 的新实例并显示它。就是这样。

标签: c# winforms


【解决方案1】:

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

由于活动被取消,您必须自己隐藏表单(当然使用Hide())。

private void Form1_Closing(Object sender, CancelEventArgs e)
{
    this.Hide();
    e.Cancel = true;
}

【讨论】:

  • 这似乎并不能阻止 OP 看到的问题。
  • 在我看来这是一个围绕 allowClose 值的逻辑问题。
  • 它确实防止了 OP 的问题,但现在我们正在处理一个看起来像关闭但实际上从未关闭的实例范围的表单(也可以随着时间的推移创建许多实例)。应该注意的是,此类表单必须通过Form.Dispose 显式终止,并且可能会通过Environment.Exit 显式退出您的应用程序,否则您可能会导致内存泄漏和不朽的隐形表单,这两者都不是好事(尽管不可否认不要总是引起问题)。
【解决方案2】:

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



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

【讨论】:

    【解决方案3】:

    有几种方法可以解决这个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多