Répéter un sous-rapport RDLC ReportViewer

je suis vraiment nouveau au RDLC alors s'il vous plaît pardonnez-moi si je manque quelque chose d'évident.

j'ai quelques données qui doivent être répétées, basées sur un ensemble de données 1:Many qui est lié au rapport principal. Ce n'est pas quelque chose qui peut être affiché sous forme de tableau parce que les clients veulent qu'il soit disposé d'une manière spécifique, donc en utilisant le contrôle de Tablix est sorti. J'ai un certain nombre de sous-rapports basés sur des ensembles de données 1:1 dans ce rapport principal, et tout va bien avec ceux-ci. J'ai créé un sous-rapport pour ce nouvel ensemble de données et l'a ajouté au rapport principal du RDLC. Tout fonctionne bien, mais il ne comprend que le premier enregistrement de l'ensemble de données.

est-il possible de répéter ce sous-rapport pour chaque enregistrement dans l'ensemble de données? Je pense que la chose qui me confond est que le RDLC principal n'a pas de code qui charge spécifiquement les sous-rapports individuels, donc je ne vois aucun endroit évident où je pourrais inclure une boucle ou quelque chose.

17
demandé sur Johnny Bones 2018-09-20 17:44:15

1 réponses

Si vous n'avez pas de besoins particuliers, je pense qu'il est important de savoir que vous pouvez mettre un RectangleTablix cellule et ensuite l'utiliser comme un conteneur pour les commandes simples comme TextBox,Line,Image, etc. appliqué comme vous le souhaitez.

Si vous avez encore besoin d'utiliser un sous-rapport, vous pouvez mettre un SubReportTablix cell et résoudre tout problème dans le LocalReport.SubreportProcessing événement qui se produit lorsqu'un sous-rapport est traité.

Si vous avez beaucoup de dossiers vous pouvez utiliser un Dataset et filtré dans le SubreportProcessing événement, à l'aide de la sous -Parameters que vous avez déjà définie dans Designer Mode.

Private Sub SubreportProcessingHandler(sender As Object, e As SubreportProcessingEventArgs)

    Dim dvFiltered As New DataView(Me.YourDataSet.Tables(0))

    dvFiltered.RowFilter = "Parameter1 = " & CInt(e.Parameters.Item("yourParameter1").Values(0)) & " AND " _
        & "Parameter2 = '" & CStr(e.Parameters.Item("yourParameter2").Values(0)) & "'"

    e.DataSources.Add(New ReportDataSource("YourDataSourceName", dvFiltered.ToTable("YourDataSourceName")))

End Sub

par exemple, en utilisant un DataSet qui contient des données master et details, vous pouvez construire un rapport principal groupé par IdMaster et mettez un sous-rapport dans la section Détails.

main report

Ceci est le sous-rapport: veuillez noter que le DataSet est le même que le rapport principal, mais nous avons également besoin de 2 Parameters (IdMaster et IdRow) pour afficher les données correctes.

sub report

dans le rapport principal, vous devez lier le sous-rapport Parameters aux valeurs réelles de DataSet.

sub report parameter

puis, la partie la plus importante: le SubreportProcessingHandler événement. Cet événement est déclenché pour chaque instance du sous-rapport dans le rapport principal, donc si vous avez 100 lignes / 100 sous-rapports cet événement est déclenché 100 times: chaque fois que vous devez spécifier quelles données vous voulez afficher, vous devez donc filtrer le DataSet utilisation de la 2 Parameters (IdMaster et IdRow) défini à l'étape précédente et rempli de valeurs provenant du rapport maître.

Private Sub SubreportProcessingHandler(sender As Object, e As SubreportProcessingEventArgs)

    Dim dvTest As New DataView(Me.dsTest.Tables(0))
    dvTest.RowFilter = "IdMaster = " & CInt(e.Parameters.Item("parIdMaster").Values(0)) & " AND " _
        & "IdRow = " & CInt(e.Parameters.Item("parIdRow").Values(0))

    e.DataSources.Add(New ReportDataSource("DataSet_TEST", dvTest.ToTable("DataSet_TEST")))

End Sub

voici le résultat:

result

Comme je l'ai dit au début de la réponse, si vous n'avez pas de besoins particuliers, vous pouvez utiliser un Rectangle au lieu d'un SubReport. Au sujet de cette exemple vous pouvez obtenir le même résultat en utilisant le vert Rectangle en tant que conteneur.

rectangle

6
répondu tezzo 2018-09-28 08:59:41