水晶报表-值不能为空.参数名称:window

本文关键字:参数 window 报表 不能 水晶 | 更新日期: 2023-09-27 18:12:14

我最近遇到了一个不寻常的错误,当试图通过一个对话框加载一个水晶报表表单到我的WPF应用程序,报告将显示为加载几秒钟,然后抛出一个错误,指出"值不能为空。参数名称:window"

这让我很困惑,据我所知,水晶报告不使用一个名为窗口的参数。

这是我的代码:

一个带有CrystalReportsViewer的简单窗口

<Window x:Class="Client.Views.ReportsWindowView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:SAPBusinessObjects.WPF.Viewer;assembly=SAPBusinessObjects.WPF.Viewer"
    Title="ReportsWindowView" Height="300" Width="300" Loaded="Window_Loaded">
<Grid>
    <my:CrystalReportsViewer ShowOpenFileButton="True" Grid.Column="1" x:Name="ReportView"/>
</Grid>

和从后面的代码加载报告(为了简单起见,我删除了标准的ConnectionInfo代码)

 cryRpt = new ReportDocument();
 cryRpt.Load("report.rpt");
 ReportView.ViewerCore.ReportSource = cryRpt;

水晶报表-值不能为空.参数名称:window

当Crystal Reports试图显示内部错误时,它确实使用了一个名为window的参数。

CrystalReportsViewer处理内部错误,并将尝试显示一个消息框:

System.Windows.MessageBox.Show(Window owner, String messageBoxText, String caption, MessageBoxButton button, MessageBoxImage icon)

显示方法获得u201CWindow的owneru201D参数和CrystalReportsViewer尝试通过Owner属性CrystalReportsViewer。Owner,但是默认的Owner是空的,因此我们得到这个意外的错误。

一个简单的解决办法是,在代码后面(即使使用mvvm),我们只需通过以下代码将所有者设置为当前窗口:
ReportView.Owner = Window.GetWindow(this);

在OnLoaded事件或类似事件中执行此操作,您将发现现在您得到一个消息框,其中包含CrystalReportsViewer抛出的内部错误。

这个解决方案的功劳属于这个线程