2

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

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

我试图做这样的事情:

ReportViewer1.LocalReport = myLocalReport 

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

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

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

4

2 回答 2

0

我的情况与您类似,我有可以创建本地报告的服务,然后可以将其生成为 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);
于 2013-01-15T00:43:23.780 回答
0

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

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

reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("GravatomsReportRegister", GravatomsFullInfoByIdBindingSource));
            reportViewer1.LocalReport.ReportEmbeddedResource = "Gravatun.GraviGrancumReport.rdlc";
            reportViewer1.RefreshReport();
于 2012-01-28T20:37:35.970 回答