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>

Comments

Popular posts from this blog

Printing SSRS 2008 R2 Reports from C#.

Using IOptions class in .Net Core Unit Testing.