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.