Visual Studio LocalReport对象和ReportViewer

Visual Studio LocalReport对象和ReportViewer

问题描述:

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

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

我tryed做这样的事情:

ReportViewer1.LocalReport = myLocalReport 

,但没有运气,因为LocalReport财产上ReportViewer是只读...

对此有何暗示?提前致谢。

(我知道这用ReportViewer1.LocalReport方法。我想要的是建立一个单一的代码,并将其直接或预览的形式绑定到打印机瓶坯)

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

尝试这样的事情,或者如果您的报告不嵌入尝试设置LocalReport

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

的ReportPath财产我也有类似的情况,你是我有一个可以创造服务然后,由于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);