【问题标题】:Report viewer in wpf and selection formulawpf 中的报表查看器和选择公式
【发布时间】:2011-04-28 05:34:56
【问题描述】:

我有一个 WPF 应用程序,我想在其中显示 SQL Server Reporting Services sql 2008 报表。我知道我们必须使用主机寡妇控件,然后在报表查看器控件中使用。我想使用远程处理模式。 我的代码示例是: 我添加了命名空间:

使用 System.Windows.Forms; 使用 System.Windows.Forms.Integration; 使用 Microsoft.Reporting;
使用 Microsoft.ReportingServices; 使用 Microsoft.Reporting.WinForms;

我的 XAML:

xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:wfr="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"

Title="ReportHost" Height="300" Width="300">
<Grid>
    <wfi:WindowsFormsHost Height="100" Margin="39,27,39,0" Name="winFormsHost" VerticalAlignment="Top" >

        <wfr:ReportViewer x:Name="rptViewer" ProcessingMode="Remote"   />  

    </wfi:WindowsFormsHost>

</Grid>

代码:

rptViewer.ServerReport.ReportServerUrl = 
  new Uri("http://mymachine-:8080/ReportServer_myreports");
rptViewer.ServerReport.ReportPath="/Reports/mytestreport.rdl";
rptViewer.ServerReport.Refresh();

我的问题是如何在 microsoft 报表查看器控件中设置选择公式 [如水晶报表]。或者 miscroft 提供了其他任何类似于水晶报表中的选择公式的其他内容。

当我运行代码时,它只在主机窗口控件中显示报表查看器,而不是在窗口中显示报表数据。

请有人向我提供所有步骤列表,我必须通过示例代码来获得所需的结果。

我们会尽快回复。

【问题讨论】:

    标签: wpf reportviewer


    【解决方案1】:

    对于报告的路径,不要使用 .rdl 扩展名:

    rptViewer.ServerReport.ReportPath="/Reports/mytestreport";

    抱歉,我不熟悉 Crystal Reports 的选择公式。

    【讨论】:

      【解决方案2】:

      在远程模式下使用 ReportViewer 有几个方面的痛苦,其中之一是您必须将所有内容编码为参数 - 您不能只设置选择公式并完成它。

      我建议您改用 LocalReport。您所要做的就是从服务器检索 RDL、执行查询并设置 DataSources 属性。主要优点是您实际上根本不需要服务器,并且您不必担心服务器配置更改会破坏您的应用程序,但您也可以获得更好的性能(通常)和更大的灵活性。

      如果您使用 LocalReport,您可以使用 ReportEmbeddedResource 将您的报告嵌入到您的 .exe 或 .dll 中,或者您可以将它们作为 .exe 或 .dll 旁边的文件并使用 ReportPath,或者您可以将它们放在服务器上并将它们下载到临时目录中使用。

      使用 LocalReport 时,进行任意选择是微不足道的:只需添加一些 LINQ。换句话说,替换这个:

      viewer.LocalReport.DataSources.Add(
        new ReportDataSource("Sales", GetSalesData()));
      

      用这个:

      viewer.LocalReport.DataSources.Add(
        new ReportDataSource("Sales", GetSalesData().Where(d => d.Amount > 10)));
      

      我能想到您可能需要在服务器上运行报告并处理痛苦和低效率的唯一原因是:1. 如果客户端由于安全锁定而无法以任何其他方式获取数据, 和 2. 如果一个巨大的数据集被检索并处理成一个小集并且客户端是小的或远程的。在这两种情况下,您唯一的选择是手动将参数添加到 RDL,然后使用这些参数过滤您的数据。

      【讨论】:

        【解决方案3】:

        感谢雷·伯恩斯,

        根据我们的讨论,我得出的结论是:

        1) 如果我使用远程处理模式,那么我必须传递我必须过滤记录的所有参数。

        2) 如果我使用本地处理模式,那么在 C# 代码中我必须设置报表的数据源。

        但是

        由于我使用的是 microsoft Reporting services sql 2008。我在 SQL server Business intellegence Studio 中设计了报告,我编写了查询/或调用存储过程,并设置了数据源。所以这意味着repoorts应该只包含设计,所有与数据库相关的东西都将在C#代码中处理? 而且所有的客户端机器都在本地有报告,这是个好方法吗?

        【讨论】:

          猜你喜欢
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多