2012-01-30 17 views
4

私は、MicrosoftのコントロールReportViewerでカスタムコントロールを持っています。フォームがこのカスタムコントロールでアクティブなときに右上の赤い十字をクリックしてアプリケーションを終了すると、System.CannotUnloadAppDomainExceptionが表示されます。System.CannotUnloadAppDomainExceptionを処理する方法は?

これは、MS ReportViewerコントロールの既知のバグです。この例外が表示されないようにするには、ReleaseSandboxAppDomainメソッドを呼び出す必要があります。私はこれを試みましたが、それを働かせることはできません。カスタムコントロールのParentForm_Closingイベントでこのメソッドを呼び出します。右上の赤い十字をクリックしてアプリケーションを閉じると、このイベントは発生しません。

私の質問は、この例外が表示されないようにするにはどうすればいいですか?

this.ParentForm.FormClosing += delegate 
{ 
    reportViewer.LocalReport.ReleaseSandboxAppDomain(); 
}; 
+0

関連コード(「ReleaseSandboxAppDomain」などと呼ばれるコード)を表示してください。 – ken2k

+0

@ ken2k私の質問が更新されました – Martijn

+0

投稿したコードはうまく動作します。イベントが発生しない場合は、コード内に他のイベントが発生しないようにします。あなたのフォームのClosingイベントハンドラが特別なものはありますか? – ken2k

答えて

5

事実あなたParentFormは間違いパネル内あるあなたの問題である:ここでは

ReleaseSandboxAppDomainメソッドを呼び出すコードがあります。

私はあなたのケースを理解していれば、あなたは以下のコントロール/フォームがあります。

  • MainFormを、アプリケーションのメインフォームが
  • Panel1MainForm
  • TheParentFormされる内部コントロールであるパネルです内部にある形Panel1TopLevelを偽とする)
  • UserControl1は、のユーザコントロールですあなたがMainFormを閉じると
  • ReportViewerは、それがトップレベルフォームではないのでTheParentFormを閉じていない、UserControl1

内部のMicrosoftユーザーコントロールです。 Panel1内部のすべてのコントロールを

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    foreach (Control ctrl in this.Panel1.Controls) 
    { 
     Form ctrlAsForm = ctrl as Form; 
     if (ctrlAsForm != null) 
     { 
      ctrlAsForm.Close(); 
     } 
    } 
} 

これがループを、そしてコントロールがフォームの場合は、明示的にClose()メソッドを呼び出そう:何あなたができることはFormClosingイベントハンドラでのごMainFormのnに次のコードを追加している 。 したがって、メインフォームを閉じると、Panel1の中にある非トップフォームも閉じます。

さて、あなたはすでにUserControl1に書いたように:

this.ParentForm.FormClosing += delegate 
{ 
    reportViewer.LocalReport.ReleaseSandboxAppDomain(); 
}; 

それがOKである必要があります。 TheParentFormが閉鎖されると、あなたの清掃を行い、あなたの例外を避けることができます。

関連する問題