Reporting Services impostare le voci dell’elenco per l’esportazione

Articolo che illustra la possibilità di limitare il numero di voci di esportazione dei report del controllo Reporting Services, tramite il linguaggio VB.Net e C#.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori


Figura 1

Introduzione

Nell’articolo verrà illustrata una tecnica riguardante la creazione di una classe che permette di personalizzare il controllo ReportViewer, in particolare la possibilità di personalizzare la casella combinata per l’esportazione del report, con solo due voci, come illustrato in figura 1.
Quando si utilizza un controllo Reportviewer per la visualizzazione dei report creati con Reporting Services, il controllo espone alcune funzionalità, come la visualizzazione della casella combinata relativa allo zoom, il pulsante di aggiornamento della pagina, ed altro ancora, tra queste funzionalità, si trova la casella combinata per l’esportazione del report in un determinato formato (PDF, Excel, csv, ecc) .
Per personalizzare tale casella, si può fare in due modi, o modificare una parte del webconfig relativo al reporting services, ma questo influisce su tutti report, oppure tramite codice .Net, personalizzare tale casella.
In questo articolo, vedremo come visualizzare due voci per l’esportazione del report nel formato PDF e Excel.

Creazione della classe

Dopo aver aggiunto il riferimento allo spazio dei nomi Microsoft.Reporting.WebForms si crea una classe che avrà il compito di personalizzare il controllo ReportViewer.
La classe ha due costruttori, il primo costruttore accetta un oggetto di tipo ReportViewer, che è il controllo che andremo a passare, mentre il secondo costruttore, accetta il valore di un oggetto di tipo ServerReport, questa classe è anche una proprietà del controllo ReportViewer.
Il metodo AbilitaFormato, è una funzione pubblica che viene richiamata nelle nostre applicazioni web (o windows) passando un array di tipo string, relativo al formato (imposto da Reporting Services) che vogliamo visualizzare nella casella combinata.
Il metodo privato nascondi Voci, viene richiamato dal metodo pubblico, creando un oggetto di tipo FieldInfo relativo alla proprietà che permette di visualizzare o no il campo, mentre con il metodo SetValue, si imposta a false tale proprietà.

Si riporta il codice completo della classe

Codice VB.Net

Imports System.Reflection
Imports Microsoft.Reporting.WebForms
Imports Microsoft.SqlServer.ReportingServices2005.Execution

Public Class ReportingServicesAbilitaVoci
    Private ReadOnly serverReport As ServerReport
    ''' <summary>
    ''' Costruttore della classe - passare il controllo ReportinViewer dopo averlo valorizzato in base al percorso del report
    ''' </summary>
    ''' <param name="rpReportViewer"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal rpReportViewer As Microsoft.Reporting.WebForms.ReportViewer)
        Me.serverReport = rpReportViewer.ServerReport
    End Sub
    Public Sub New(ByVal rpReportViewer As Microsoft.Reporting.WebForms.ServerReport)
        Me.serverReport = rpReportViewer
    End Sub
    ''' <summary>
    ''' Funzione che abilita un determinato formato
    ''' </summary>
    ''' <param name="formati">Array di tipo string ES. PDF, EXCEL</param>
    ''' <remarks></remarks>
    Public Sub AbilitaFormato(ByVal formati As String())
        For Each extension As RenderingExtension In serverReport.ListRenderingExtensions()
            If formati.Length > 0 Then
                If formati.Contains(extension.Name) <> True Then
                    NascondiVoce(extension)
                End If
            End If
        Next
    End Sub
    ''' <summary>
    ''' Funzione che nasconde la voce
    ''' </summary>
    ''' <param name="extension"></param>
    ''' <remarks></remarks>
    Private Sub NascondiVoce(ByVal extension As RenderingExtension)
        'Rilevo l'impostazione di tipo visibile
        Dim m_isVisible As FieldInfo = extension.GetType().GetField("m_isVisible", BindingFlags.NonPublic & BindingFlags.Instance)
        'Imposto il valore a False in modo che nasconde la voce
        m_isVisible.SetValue(extension, False)
    End Sub
End Class


Codice C#

using Microsoft.Reporting.WebForms;
using Microsoft.SqlServer.ReportingServices2005.Execution
 
public class ReportingServicesAbilitaVoci
{
    private readonly ServerReport serverReport;
    /// <summary>
    /// Costruttore della classe - passare il controllo ReportinViewer dopo averlo valorizzato in base al percorso del report
    /// </summary>
    /// <param name="reportViewer"></param>
    public ReportingServicesAbilitaVoci(Microsoft.Reporting.WebForms.ReportViewer reportViewer)
    {
>        this.serverReport = reportViewer.ServerReport;
    }
    public ReportingServicesAbilitaVoci(ServerReport serverReport)
    {
        this.serverReport = serverReport;
    }
    /// <summary>
    /// Funzione che abilita un determinato formato
    /// </summary>
    /// <param name="Formati">Array di tipo string ES. PDF, EXCEL</param>
    public void AbilitaFormato(string[] Formati)
    {
        foreach (RenderingExtension extension in serverReport.ListRenderingExtensions())
        {
            if (Formati.Length > 0)
            {
                if (Formati.Contains(extension.Name) != true)
                {
                    NascondiVoce(extension);
                }
            }
        }
    }
>    /// <summary>
    /// Funzione che nasconde la voce
    /// </summary>
    /// <param name="extension"></param>
    private void NascondiVoce(RenderingExtension extension)
    {
        //Rilevo l'impostazione di tipo visibile
        FieldInfo m_isVisible = extension.GetType().GetField("m_isVisible", BindingFlags.NonPublic | BindingFlags.Instance);
        //Imposto il valore a False in modo che nasconde la voce
        m_isVisible.SetValue(extension, false);
    }
}

Effettuare il test

Ora non ci resta che testare la nostra classe, dalla pagina asp.net, dopo aver valorizzato il controllo ReportViewer, con le dovute impostazioni , nell’evento load della pagina, come riportato qui di seguito-.

Codice VB.Net

ReportViewer1.ServerReport.ReportPath = ReportPath


Codice C#

ReportViewer1.ServerReport.ReportPath = ReportPath;

Il codice riportato qui di seguito è da utilizzare nell’evento load, ma nel caso, che il report, permette la navigazione (tramite collegamenti) ad altri report, dobbiamo inserire il codice nell’evento loadcomplete, in modo che ad ogni caricamento, imposta la combobox, altrimenti viene impostata solo nel primo report

Codice VB.Net

Private Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete
Dim report as new ReportingServicesAbilitaVoci (ReportViewer)
Dim formati As String() = {"PDF", "EXCEL"}
report. AbilitaFormato(formati)
End Sub


Codice C#

protected void Page_LoadComplete(object sender, EventArgs e)
{
 
ReportingServicesAbilitaVoci report = new ReportingServicesAbilitaVoci(ReportViewer1);
 
string[] Formati = new string[] { "PDF", "EXCEL" };
report.AbilitaFormato(Formati);
}
}

 

Conclusioni

Si è visto come personalizzare una parte del controllo ReportViewer di reporting Services 2005, visualizzando determinati formati di esportazioni.
La classe può essere estesa con funzionalità che permettono altre impostazioni, come la modifica del testo nella casella di esportazione o altro ancora.