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が既に破棄されているオブジェクトを呼び出し、エラーが発生する可能性があるためです。

編集:

また、 ||を変更する必要があると思います ウィンドウが破棄されていないが破棄ステータスになっている場合は、エラーが発生する可能性があるため、&&に変更します。

于 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 に答える