Print from WPF using ReportViewer Control
Came across a requirements in a project that i was working on were we had to show SQL reports from inside of a WPF application(that WPF does not have a way to show SQL Reports requires another post). Could not find a complete solution that will give the user the code to add and show SQL Reports from WPF. The environment that i have used for this solution is Visual Studio 2010, SQL 2008 R2 deployed on a remote server
Below is the complete code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ReportViewer
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
private ReportViewerClass viewer = null;
private string reportPath = string.Empty;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
viewer = new ReportViewerClass();
viewer.URL = "http:///Reportserver" ;
viewer.Settings.ShowBackButton = true;
viewer.Settings.ShowContextMenu = true;
viewer.Settings.ShowExportButton = true;
viewer.Settings.ShowParameterPrompts = false;
viewer.Settings.ShowPrintButton = true;
viewer.Settings.ShowToolBar = true;
this.viewerInstance.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Remote;
}
private void btnGenerateLPN_Click(object sender, RoutedEventArgs e)
{
ReportParameter param = new ReportParameter() { ParameterName = "NumberofLpn", ParameterValue = "2" };
viewer.Settings.ShowParameterPrompts = false;
viewer.Name = "/Reports/Report";
viewer.Parameters.RemoveRange(0, viewer.Parameters.Count());
viewer.Parameters.Add(param);
RenderReport(viewer);
}
private void btnGeneratePOs_Click(object sender, RoutedEventArgs e)
{
viewer.Settings.ShowParameterPrompts = true;
viewer.Name = "/Reports/Report2";
viewer.Parameters.RemoveRange(0, viewer.Parameters.Count());
RenderReport(viewer);
}
private void RenderReport(ReportViewerClass view)
{
this.viewerInstance.ShowBackButton = view.Settings.ShowBackButton;
this.viewerInstance.ShowContextMenu = view.Settings.ShowContextMenu;
this.viewerInstance.ShowExportButton = view.Settings.ShowExportButton;
this.viewerInstance.ShowParameterPrompts = view.Settings.ShowParameterPrompts;
this.viewerInstance.ShowPrintButton = view.Settings.ShowPrintButton;
this.viewerInstance.ShowToolBar = view.Settings.ShowToolBar;
this.viewerInstance.ServerReport.ReportServerUrl = new Uri(view.URL);
this.viewerInstance.ServerReport.ReportPath = view.Name; //string.Format("{0}/{1}", view.Path, view.Name);
this.viewerInstance.ServerReport.DisplayName = view.Name;
foreach (ReportParameter parameter in view.Parameters)
{
Microsoft.Reporting.WinForms.ReportParameter parm = new Microsoft.Reporting.WinForms.ReportParameter(parameter.ParameterName, parameter.ParameterValue);
this.viewerInstance.ServerReport.SetParameters(parm);
}
this.viewerInstance.RefreshReport();
}
}
public class ReportViewerSettings
{
public ReportViewerSettings() { }
public bool ShowBackButton { get; set; }
public bool ShowContextMenu { get; set; }
public bool ShowParameterPrompts { get; set; }
public bool ShowExportButton { get; set; }
public bool ShowPrintButton { get; set; }
public bool ShowToolBar { get; set; }
}
public class ReportParameter
{
public ReportParameter()
{
ParameterValue = string.Empty;
ParameterName = string.Empty;
}
//using the string data type as that is what the acatual report parameter takes.
public string ParameterName { get; set; }
public string ParameterValue { get; set; }
}
public class ReportViewerClass
{
private ReportViewerSettings settings = null;
private string url = null;
private string name = string.Empty;
private List<ReportParameter> parameters = null;
public ReportViewerClass()
{
settings = new ReportViewerSettings();
url = string.Empty;
name = string.Empty;
parameters = new List<ReportParameter>();
}
public ReportViewerSettings Settings
{
get { return settings; }
set { settings = value; }
}
public string URL
{
get { return url; }
set { url = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
//public string Path
//{
// get { return path; }
// set { path = value; }
//}
public List<ReportParameter> Parameters
{
get { return parameters; }
set { parameters = value; }
}
}
}
And the XAML is
<Window x:Class="ReportViewer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewer="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"
Title="Report Viewer Demo" Height="450" Width="700" Loaded="Window_Loaded">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="147" />
<ColumnDefinition Width="356" />
Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="35*" />
<RowDefinition Height="276*" />
Grid.RowDefinitions>
<Button Name="btnGenerateLPN" Margin="0,4,0,0" Click="btnGenerateLPN_Click" HorizontalAlignment="Left" Width="121">Generate LPNButton>
<Button Name="btnGeneratePOs" Margin="12,4,0,0" Click="btnGeneratePOs_Click" Grid.Column="1" HorizontalAlignment="Left" Width="116">Generate PO'sButton>
<WindowsFormsHost Name="windowsFormsHost1" Grid.Row="1" Grid.ColumnSpan="2" Margin="0,0,-175,0">
<viewer:ReportViewer x:Name="viewerInstance" ShowBackButton="True" >
viewer:ReportViewer>
WindowsFormsHost>
Grid>
Window>
Below is the complete code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ReportViewer
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
private ReportViewerClass viewer = null;
private string reportPath = string.Empty;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
viewer = new ReportViewerClass();
viewer.URL = "http://
viewer.Settings.ShowBackButton = true;
viewer.Settings.ShowContextMenu = true;
viewer.Settings.ShowExportButton = true;
viewer.Settings.ShowParameterPrompts = false;
viewer.Settings.ShowPrintButton = true;
viewer.Settings.ShowToolBar = true;
this.viewerInstance.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Remote;
}
private void btnGenerateLPN_Click(object sender, RoutedEventArgs e)
{
ReportParameter param = new ReportParameter() { ParameterName = "NumberofLpn", ParameterValue = "2" };
viewer.Settings.ShowParameterPrompts = false;
viewer.Name = "/Reports/Report";
viewer.Parameters.RemoveRange(0, viewer.Parameters.Count());
viewer.Parameters.Add(param);
RenderReport(viewer);
}
private void btnGeneratePOs_Click(object sender, RoutedEventArgs e)
{
viewer.Settings.ShowParameterPrompts = true;
viewer.Name = "/Reports/Report2";
viewer.Parameters.RemoveRange(0, viewer.Parameters.Count());
RenderReport(viewer);
}
private void RenderReport(ReportViewerClass view)
{
this.viewerInstance.ShowBackButton = view.Settings.ShowBackButton;
this.viewerInstance.ShowContextMenu = view.Settings.ShowContextMenu;
this.viewerInstance.ShowExportButton = view.Settings.ShowExportButton;
this.viewerInstance.ShowParameterPrompts = view.Settings.ShowParameterPrompts;
this.viewerInstance.ShowPrintButton = view.Settings.ShowPrintButton;
this.viewerInstance.ShowToolBar = view.Settings.ShowToolBar;
this.viewerInstance.ServerReport.ReportServerUrl = new Uri(view.URL);
this.viewerInstance.ServerReport.ReportPath = view.Name; //string.Format("{0}/{1}", view.Path, view.Name);
this.viewerInstance.ServerReport.DisplayName = view.Name;
foreach (ReportParameter parameter in view.Parameters)
{
Microsoft.Reporting.WinForms.ReportParameter parm = new Microsoft.Reporting.WinForms.ReportParameter(parameter.ParameterName, parameter.ParameterValue);
this.viewerInstance.ServerReport.SetParameters(parm);
}
this.viewerInstance.RefreshReport();
}
}
public class ReportViewerSettings
{
public ReportViewerSettings() { }
public bool ShowBackButton { get; set; }
public bool ShowContextMenu { get; set; }
public bool ShowParameterPrompts { get; set; }
public bool ShowExportButton { get; set; }
public bool ShowPrintButton { get; set; }
public bool ShowToolBar { get; set; }
}
public class ReportParameter
{
public ReportParameter()
{
ParameterValue = string.Empty;
ParameterName = string.Empty;
}
//using the string data type as that is what the acatual report parameter takes.
public string ParameterName { get; set; }
public string ParameterValue { get; set; }
}
public class ReportViewerClass
{
private ReportViewerSettings settings = null;
private string url = null;
private string name = string.Empty;
private List<ReportParameter> parameters = null;
public ReportViewerClass()
{
settings = new ReportViewerSettings();
url = string.Empty;
name = string.Empty;
parameters = new List<ReportParameter>();
}
public ReportViewerSettings Settings
{
get { return settings; }
set { settings = value; }
}
public string URL
{
get { return url; }
set { url = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
//public string Path
//{
// get { return path; }
// set { path = value; }
//}
public List<ReportParameter> Parameters
{
get { return parameters; }
set { parameters = value; }
}
}
}
And the XAML is
<Window x:Class="ReportViewer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewer="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"
Title="Report Viewer Demo" Height="450" Width="700" Loaded="Window_Loaded">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="147" />
<ColumnDefinition Width="356" />
Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="35*" />
<RowDefinition Height="276*" />
Grid.RowDefinitions>
<Button Name="btnGenerateLPN" Margin="0,4,0,0" Click="btnGenerateLPN_Click" HorizontalAlignment="Left" Width="121">Generate LPNButton>
<Button Name="btnGeneratePOs" Margin="12,4,0,0" Click="btnGeneratePOs_Click" Grid.Column="1" HorizontalAlignment="Left" Width="116">Generate PO'sButton>
<WindowsFormsHost Name="windowsFormsHost1" Grid.Row="1" Grid.ColumnSpan="2" Margin="0,0,-175,0">
<viewer:ReportViewer x:Name="viewerInstance" ShowBackButton="True" >
viewer:ReportViewer>
WindowsFormsHost>
Grid>
Window>
Comments
Post a Comment