Mar*_*ijn 4 c# exception winforms
我有一个带有ReportViewer
Microsoft 控件的自定义控件.使用此自定义控件激活表单时,单击红色十字(在右上角)退出应用程序,我得到一个System.CannotUnloadAppDomainException
.
我已经读过这是MS ReportViewer控件的已知错误.要防止显示此异常,您需要调用该ReleaseSandboxAppDomain
方法.我试过这个,但它无法让它发挥作用.我ParentForm_Closing
在自定义控件中的事件上调用此方法.但是,当您通过单击右上角的红叉来关闭应用程序时,不会触发此事件.
所以我的问题是,如何防止此异常显示?
以下是调用该ReleaseSandboxAppDomain
方法的代码:
this.ParentForm.FormClosing += delegate
{
reportViewer.LocalReport.ReleaseSandboxAppDomain();
};
Run Code Online (Sandbox Code Playgroud)
您ParentForm
在面板内的事实肯定是您的问题.
如果我理解你的情况,你有以下控件/表格:
MainForm
是您的应用程序的主要形式Panel1
是一个内部控件的面板 MainForm
TheParentForm
是一个内部的形式Panel1
(TopLevel
作为假)UserControl1
是一个用户控件里面 TheParentForm
ReportViewer
是里面的Microsoft用户控件 UserControl1
当你关闭时MainForm
,因为它不是顶级形式TheParentForm
而没有关闭.您可以做的是在事件处理程序中的n中添加以下代码:MainForm
FormClosing
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将遍历内部的所有控件Panel1
,并尝试Close()
在控件是表单时显式调用该方法.因此,关闭主窗体也将关闭内部的非顶层形状Panel1
.
现在,正如你已经写过UserControl1
:
this.ParentForm.FormClosing += delegate
{
reportViewer.LocalReport.ReleaseSandboxAppDomain();
};
Run Code Online (Sandbox Code Playgroud)
应该没事; 何时TheParentForm
关闭,您将能够进行清理并避免异常.