【问题标题】:Visual Studio LocalReport Object and ReportViewerVisual Studio LocalReport 对象和 ReportViewer
【发布时间】:2012-01-16 20:44:49
【问题描述】:

有没有办法处理LocalReport 对象(完成这部分),然后在ReportViewer 控件中,在另一个表单上显示它?这个想法是在没有 ReportViewer 的情况下打印(已经完成),但是,如果用户想要也可以预览他将要打印的内容。

我正在使用 Visual Basic .NET SDK 3.5 和 Visual Studio 2008。如果需要,也可以使用 2010。

我试着做这样的事情:

ReportViewer1.LocalReport = myLocalReport 

但没有运气,因为ReportViewer 上的LocalReport 属性是只读的...

对此有任何提示吗?提前致谢。

(我知道使用ReportViewer1.LocalReport 方法来执行此操作。我想要的只是创建一个代码并将其直接绑定到打印机或预览表单)

【问题讨论】:

    标签: vb.net reporting-services report reportviewer localreport


    【解决方案1】:

    LocalReport 是只读的,但 ReportPath 和 ReportEmbeddedResource 是可设置的

    尝试这样的事情,或者如果您的报告没有嵌入,请尝试设置 LocalReport 的 ReportPath 属性

    reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("GravatomsReportRegister", GravatomsFullInfoByIdBindingSource));
                reportViewer1.LocalReport.ReportEmbeddedResource = "Gravatun.GraviGrancumReport.rdlc";
                reportViewer1.RefreshReport();
    

    【讨论】:

      【解决方案2】:

      我的情况与您类似,我有可以创建本地报告的服务,然后可以将其生成为 PDF、电子邮件等。但是,因为 ReportViewer.LocalReport 是只读属性,我不得不复制用于构建报告或将值从我的 LocalReport 复制到 ReportViewer.LocalReport 的代码。我不喜欢这两种选择,因为可能无法复制某些内容(即子报告事件)或存在代码重复。

      我想出了以下扩展,它通过反射在 ReportViewer 上设置 LocalReport。我还没有完全测试过,这可能是个坏主意!但是,它似乎适用于我目前正在从事的项目。我不知道 ReportViewer 是否对其本地报告进行了一些额外的初始化,所以可能会发生一些事情......

      我不能强调这一点 - 使用风险自负 - 这样做可能不是一个好主意

      public static class ReportViewerExtensions
      {
          public static void SetLocalReport(this ReportViewer reportViewer, LocalReport report)
          {
              var currentReportProperty = reportViewer.GetType().GetProperty("CurrentReport", BindingFlags.NonPublic | BindingFlags.Instance);
              if (currentReportProperty != null)
              {
                  var currentReport = currentReportProperty.GetValue(reportViewer, null);
                  var localReportField = currentReport.GetType().GetField("m_localReport", BindingFlags.NonPublic | BindingFlags.Instance);
                  if (localReportField != null)
                  {
                      localReportField.SetValue(currentReport, report);
                  }
              }
              reportViewer.RefreshReport();
          }
      }
      

      用法:

      LocalReport localReport = reportService.GenerateCurrentOrdersReport(....);
      reportViewer.SetLocalReport(localReport);
      

      【讨论】:

        猜你喜欢
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多