1

当应用程序收到来自服务的调用时,它会为每个调用打开一个表单。用户必须在每个窗口中输入并关闭它。为了使用户的工作顺利进行,我试图在显示下一个窗口时重新激活用户正在处理的窗口。

执行此操作的方法如下:

private void ActivatePreviousActiveForm() {

    if (_activeWhenOpen != null && _activeWhenOpen.InvokeRequired) {
         if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
              _activeWhenOpen.Invoke((MethodInvoker)ActivatePreviousActiveForm);
    } else
         if (_activeWhenOpen != null && !(_activeWhenOpen is FrmRuntimeError))
             _activeWhenOpen.Activate();
}

有时它会在到达线路时抛出““无法访问已处理的对象”

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)

有谁知道为什么会发生这种情况?

4

2 回答 2

5

尝试反转if条件:

这条线

if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)

必须成为

if (!_activeWhenOpen.IsDisposed || !_activeWhenOpen.Disposing)

那是因为条件是按照它们编写的顺序检查的,所以你的代码可能会调用Disposing一个已经被释放的对象,从而引发你的错误。

编辑:

我也认为你应该改变|| &&,因为如果您的窗口不是 Disposed 但处于 Disposing 状态,您可能会遇到错误。

于 2012-10-31T15:21:19.137 回答
1

您无法访问已处置的对象。为什么要处置?当用户关闭表单时,关闭的默认行为是处置它。为了防止这种情况,您必须重写 Close 方法,以便它只是隐藏表单而不是处理它。像这样:

// Use this event handler for the FormClosing event.
private void YourFormClosing(object sender, FormClosingEventArgs e)
{
  this.Hide();
  e.Cancel = true; // this will cancel the close event.
}

问候。

于 2012-10-31T15:19:13.313 回答