Событие SubreportProcessing не запускается - PullRequest
3 голосов
/ 02 декабря 2009

Я использую отчеты rdlc в WPF, поэтому сделал это с помощью оболочки WindowsFormsHost. Отчет rdlc, который я ищу, содержит вложенный отчет, и я устанавливаю источник данных этого события с помощью события SubreportProcessing ReportViewer.

Viewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LoadAccessoriesSubReport);

Моя проблема в том, что событие SubreportProcessing даже не запускается. Я определяю его в событии Window_Loaded окна WPF, которое содержит встроенный элемент управления ReportViewer, см. Ниже xaml:

       Title="ReportViewer" Height="1000" Loaded="Window_Loaded" Width="1000">
<Grid>
    <WindowsFormsHost Name="winHost">
        <wf:ReportViewer  Dock="Fill" Name="rptViewer">
        </wf:ReportViewer>  
    </WindowsFormsHost>                   
</Grid>

Буду признателен за любую помощь в этом.

Ответы [ 7 ]

6 голосов
/ 15 февраля 2010

Проверьте параметры вашего подотчета. Если условие параметра не выполняется, вложенный отчет не загружается. Также проверьте вывод трассировки Visual Studio, он показывает, какой параметр вызывает ошибку.

Чтобы выполнить быструю проверку, установите для всех параметров подотчета значение null.

Это помогло мне (теперь мне просто нужно понять, почему я получаю нулевое значение вместо ожидаемого)

2 голосов
/ 24 мая 2012

У меня была та же проблема, и я обнаружил, что ReportViewer1.Reset() очищает обработчик событий. Перемещение строки AddHandler сразу после ReportViewer1.Reset() решило проблему.

1 голос
/ 11 апреля 2012

Вот как мне удалось заставить его работать, вероятно, не лучшее решение .... он использует EF и WPF

    private void PrepareReport(ViewTravelOrderEmployees travelOrder)
    {
        entities = new PNEntities();            

        this.mform_components = new System.ComponentModel.Container();
        Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = new Microsoft.Reporting.WinForms.ReportDataSource();
        Microsoft.Reporting.WinForms.ReportDataSource reportDataSource2 = new Microsoft.Reporting.WinForms.ReportDataSource();

        this.ProductBindingSource = new System.Windows.Forms.BindingSource(this.mform_components);
        this.ProductBindingSource2 = new System.Windows.Forms.BindingSource(this.mform_components);            

        reportDataSource1.Name = "ViewTravelOrderEmployees";
        reportDataSource1.Value = this.ProductBindingSource;
        //DAL_Destination is Subreport -> Properties -> General -> Name in rdlc
        reportDataSource2.Name = "DAL_Destinations";
        reportDataSource2.Value = this.ProductBindingSource2;

        this.reprt.LocalReport.DataSources.Add(reportDataSource1);
        this.reprt.LocalReport.DataSources.Add(reportDataSource2);

        this.reprt.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(SubreportProcessingEventHandler);            

        this.reprt.LocalReport.ReportEmbeddedResource = "PNWPF.TravelOrder.rdlc";
        string exeFolder = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.StartupPath);
        string reportPath = System.IO.Path.Combine(exeFolder, @"Reports\TravelOrder.rdlc");
        this.reprt.LocalReport.ReportPath = reportPath;

        this.ProductBindingSource.DataSource = travelOrder;            
        this.reprt.RefreshReport();             
    }

        void SubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
    {
        entities = new PNEntities();

        string dataSourceName = e.DataSourceNames[0];
        //query needs to be completed this is just example
        List<Destinations> destinations = entities.Destinations.ToList();            

        e.DataSources.Add(new ReportDataSource(dataSourceName, destinations));
    }

    PNEntities entities;
    private System.ComponentModel.IContainer mform_components = null;
    private System.Windows.Forms.BindingSource ProductBindingSource;
    private System.Windows.Forms.BindingSource ProductBindingSource2;

XAML

<Window x:Class="PNWPF.frmReportWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:viewer="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"
Title="frmReportWindow" Height="300" Width="300">
<Grid>
    <wfi:WindowsFormsHost Name="winfrmHost">
        <viewer:ReportViewer x:Name="reprt">

        </viewer:ReportViewer>
    </wfi:WindowsFormsHost>
</Grid>

1 голос
/ 15 февраля 2012

Добавьте соответствующие параметры как в элементе управления подотчета в главном отчете, так и в самом подотчете.

  1. В главном отчете щелкните правой кнопкой мыши элемент управления подотчета -> Свойства ... -> Добавить "InvoiceId" "[InvoiceId]"
  2. В подотчете -> щелкните где угодно -> Просмотреть -> Данные отчета -> Параметры -> Добавить "InvoiceId"
1 голос
/ 09 декабря 2011

та же проблема здесь, хотя, возможно, этот вопрос немного стар Если вы присваиваете свои источники данных из кода, убедитесь, что вы добавили обработчик события SubreportProcessing ПОСЛЕ добавления источников данных в основной отчет. Я сделал это так:

Dim rpDataSource As New ReportDataSource("sourceMain", myDataTable1)
Dim rpDataSourceSub As New ReportDataSource("sourceSub", myDataTable2)

ReportViewer1.ProcessingMode = ProcessingMode.Local
ReportViewer1.LocalReport.EnableHyperlinks = False
ReportViewer1.Reset()
Me.ReportViewer1.LocalReport.ExecuteReportInCurrentAppDomain(AppDomain.CurrentDomain.Evidence)
ReportViewer1.LocalReport.ReportPath = "Reports\report1.rdlc"
ReportViewer1.LocalReport.DisplayName = "Report" + Today.ToString("dd-MM-yyyy")
ReportViewer1.LocalReport.Refresh()

If Not ReportViewer1.LocalReport.DataSources.Contains(rpDataSource) Then
  ReportViewer1.LocalReport.DataSources.Add(rpDataSource)
End If

If Not ReportViewer1.LocalReport.DataSources.Contains(rpDataSourceSub) Then
  ReportViewer1.LocalReport.DataSources.Add(rpDataSourceSub)
End If

AddHandler Me.ReportViewer1.LocalReport.SubreportProcessing, AddressOf Me.SetSubDataSource
Me.ReportViewer1.LocalReport.Refresh()

Я был addind в части AddHandler и раньше, и это событие никогда не было запущено. Надеюсь, что это поможет кому-то, имеющему ту же проблему.

0 голосов
/ 04 марта 2011

Попробуйте установить свойство ReportName в соответствии с именем файла отчета.

0 голосов
/ 19 января 2010

У меня была такая же проблема, использование LocalReport без использования ReportViewer в приложении WPF.

Но оказалось, что я пытался передать нулевое значение в качестве параметра из родительского отчета в подотчет.

Следовательно, вложенный отчет никогда не начинал рендеринг. Это было причиной того, что событие не было проведено.

...