Desarrollador de aplicaciones web y de escritorio, amante de la tecnología y autodidacta, me gusta conocer otras tecnologías, escribir artículos para compartir en la web y para estar al tanto en los nuevos paradigmas, respeto las políticas de software privativo y libre, ya que estas políticas son las normas que permite el desarrollo tecnológico social de la humanidad. filvovmax@gmail.com -- info@gitmedio.com
Como crear reporte con reportviewer en C# .NET en visual estudio 2017
En este articulo voy a explicar cómo crear reporte con reportviewer en C#.NET, de proceso de carga rápido. Escribo este artículo debido a la experiencia en el trabajo, solía crear reportes con CristalReport la cual es una magnifica herramienta , pero tiene sus pros y contras, uno de los problemas que frecuentemente tenia es la migración de proyecto a las versiones superiores, la cual era un dolor de cabeza. Por tal razón empezamos a usar reportviewer que ya viene incluido dentro de la biblioteca BCL de .NET .
Para usar el reportviewer en nuestras aplicaciones, vamos a utilizar colecciones para agilizar el proceso de cargar y también la clase Datable que proporciona un modelo de programación coherente independientemente del origen de datos que contiene, y también se puede usar el llenado del dataset con tablas, en fin, también existen otras formas de cargar el contenido a un reportviewer.
Para este ejemplo, se usa el gestor e base de datos SQLServer, que a continuación se muestra las siguientes tablas para generar el informe.
USE Reporte;
DROP TABLE Persona;
Create table Persona(
Idpersona INT IDENTITY(1,1),
Nombre VARCHAR(15),
ApellidoPat VARCHAR(15),
ApellidoMat VARCHAR(15),
TipoDoc INT,
Correo VARCHAR(30),
PRIMARY KEY(TipoDoc)
)
DROP TABLE Documento;
CREATE TABLE Documento(
IdDoc INT IDENTITY(1,1),
Nombre VARCHAR(20),
Vigencia BIT,
PRIMARY KEY(IdDoc)
)
ALTER TABLE Persona
ADD FOREIGN KEY(TipoDoc)
REFERENCES Documento(IdDoc)
INSERT INTO Documento(Nombre,Vigencia) VALUES('DNI',1);
INSERT INTO Documento(Nombre,Vigencia) VALUES('Certificado',1);
INSERT INTO Documento(Nombre,Vigencia) VALUES('C.I',0);
INSERT INTO Persona(Nombre,ApellidoPat,ApellidoMat,TipoDoc,Correo)
VALUES('Limber','Guitierrez','Manzaneda',1,'lim@gmail.com');
INSERT INTO Persona(Nombre,ApellidoPat,ApellidoMat,TipoDoc,Correo)
VALUES('Marcelo','Flores','Gutierez',2,'Mar@gmail.com');
Ya que hemos creado nuestras tablas de cardinalidad de 1 a 1, a continuación vamos crear procedimiento almacenado para hacer consulta a la base de datos.
CREATE PROCEDURE DatosPersona
AS
declare @valor as int=0
set @valor=(select COUNT(Per.Idpersona) FROM Persona AS Per)
IF @valor>0
SELECT
Per.Nombre,Per.ApellidoPat,Per.ApellidoMat,Doc.Nombre,Per.Correo,Doc.Vigencia
FROM Persona as Per
inner join Documento as Doc on Per.TipoDoc=Doc.IdDoc
ELSE
RETURN @valor
;Se ejecuta el procedimiento
exec DatosPersona
En el siguiente ejemplo vamos crear nuestro proyecto en visual estudio Comunity.
Despues de crear el proyecto debemos agregar el control ReportViewer, en la versión de Visual Estudio Comunity no viene incluido cuyo control, lo debemos instalar desde el repositorio, para hacer tal operación dirigirse al menú Herramientas -> Administrador de paquetes Nuget -> Consola de administrador de paquetes, en la consola pegar el siguiente fragmento de texto:
Install-Package Microsoft.ReportingServices.ReportViewerControl.WinForms –Pre
Una vez que se ha instalado ReportViewer Agregamos el control al cuadro de herramientas, clic en el derecho sobre el cuadro de herramientas -> Eligir elementos -> Examinar, debemos localizar el archivo dll que se encuentra en:
{Ruta del proyecto}\packages\Microsoft.ReportingServices.ReportViewerControl.Winforms.140.1000.523\lib\net40\Microsoft.ReportViewer.WinForms.dll
Una vez agregado el control, debemos de arrastrar al formulario principal, tal como se ve en la imagen.
Después de tener el control, necesitamos agregar la extensión RDLC para los reportes nativos de Visual Estudio, es decir nos permitirá diseñar los reportes, para realización esta acción ir a Menú herramientas -> Extensiones y actualizaciones -> Seleccionar en Linea -> en cuadro buscar escribir -> rdlc, luego haga clic en el botón descargar.
Una vez que se descargue, se debe cerrar todas las ventanas de visual estudio, y aparecera cuadros de dialogo, que son asistente de instalación, solo se debe seguir los pasos para que pueda efectuar los cambios.
Después de realizar la instalación del Plugin, ir al cuadro del proyecto generado, hacer clic derecho -> Agregar -> Nuevo elemento -> seleccionar el ítem de Informe, y agregar al proyecto el archivo de rdlc.
Después de agregar el archivo rdlc en el proyecto, nuevamente creamos un archivo para crear nuestra clase persona para agregar al origen de datos en el diseñador de reportes. El contenido de archivo se muestra el código en el siguiente ejemplo.
Archivo Persona.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PoryectoReporte{
public class Persona
{
//Propiedades
public string Nombre { get; set;}
public string ApellidoPat { get; set; }
public string ApellidMat { get; set; }
public string TipoDocument { get; set; }
public string Correo { get; set; }
public bool Vigencia { get; set; }
//Asignar el constructor por
//defecto para que no genere error
//de argumentos
public Persona() {
}
//Constructor que recibe parámetro de la misma clase
public Persona(Persona Add) {
Nombre = Add.Nombre;
ApellidoPat = Add.ApellidoPat;
ApellidMat = Add.ApellidMat;
TipoDocument = Add.TipoDocument;
Correo = Add.Correo;
Vigencia = Add.Vigencia;
}
}
}
Para mostrar y diseñar datos en el informe hacer lo siguiente, abrir el archivo Reporte.rdlc, seleccionar en el panel derecho -> Datos de informe -> conjunto de datos -> clic derecho -> Agregar conjunto de datos -> Elegir el origen de datos como Objeto y luego seleccionar la clase persona:
Al presionar el botón finalizar, renombrar en el caja de texto que esta por defecto con el nombre DataSet1 a Personas.
A continuación en el siguiente ejemplo de imagen se muestra el diseño del informe, en el cual se agrega cuadros de texto y una tabla.
Para el campo tipo de documento se agrega la siguiente expresión tal como se ve en la imagen, lo que hace es formatear el tipo de dato booleano true o false en palabras legibles para el usuario común.
He aquí el código para cargar datos en el ReportViewer en el formulario principal, en el método CargarReporte cumple el cometido para cargar datos en el informe.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using Microsoft.Reporting.WinForms;
namespace PoryectoReporte
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += Form1_Load1;
}
/// <summary>
/// Se carga los datos en el reporte
/// en el evento Load
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load1(object sender, EventArgs e)
{
CargarReporte();
}
/// <summary>
/// Método para recuperar Datos a una lista
/// y para mostrar en el ReportViewer
/// </summary>
private void CargarReporte() {
List<Persona> Agregar = new List<Persona>();
Conexionsql AcederDatos = new Conexionsql();
foreach (DataRow Lista in AcederDatos.Datos().Rows){
Agregar.Add( new Persona{
Nombre = Lista[0].ToString(),
ApellidoPat = Lista[1].ToString(),
ApellidMat = Lista[2].ToString(),
TipoDocument = Lista[3].ToString(),
Correo = Lista[4].ToString(),
Vigencia = Convert.ToBoolean(Lista[5])
});
}
///Mostrar datos en el reporte
this.reportViewer1.LocalReport.ReportEmbeddedResource = "PoryectoReporte.Reporte.rdlc";
ReportDataSource rds1 = new ReportDataSource("Personas", Agregar);
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(rds1);
this.reportViewer1.RefreshReport();
}
}
/// <summary>
/// Clase para conectarse
/// al servidor de base de datos
/// </summary>
public class Conexionsql {
/// <summary>
/// Retorna Tabla con datos
/// </summary>
/// <returns></returns>
public DataTable Datos() {
// Fragmento de código para
//Para conexión al SQLSERVER
DataTable Retornar=new DataTable();
SqlConnection Conectar = new SqlConnection(@"Data Source={Nombreservidor};Initial Catalog=Reporte;Integrated Security=True");
Conectar.Open();
//Se ejecuta el procedimiento almacenado
SqlDataAdapter Comandosql = new SqlDataAdapter("exec DatosPersona", Conectar);
Comandosql.Fill(Retornar);
Conectar.Close();
return Retornar;
}
}
}
Al ejecutar el proyecto debería de mostrarse como en el siguiente ejemplo de imagen.
El ejemplo de cómo crear reporte con reportviewer C# .NET, he aquí disponible para la descarga.
Ejemplo practico 33MB
Todo muy lindo, pero cuando quieres agregar una referencia a una dll nunca la encuentra. Una porquería
Rodrigo buenas tardes, escribí hace tiempo solicitando ayuda, es en c# con reportviewer, al diseñar todo correcto, pero al visualizar el reporte o imprimir en ves de imprimir en toda la hoja A4, es como que hace un zoom y lo hace a un 60% y desperdicia espacio, pero el problema es visual porque se ve una impresión reducida, porfis puedes ayudarme, gracias de antemano
Hola como estas Martha, por favor envíame tu ejemplo, a mi correo, para poder ayudarte.
Revisa bien si lo configuraste bien los márgenes y el tamaño de la hoja para realizar cuyo configuración diríjase a –>INFORME–>PROPIEDADES.
y para imprimir o hacer pruebas utiliza un software que te permita imprimir virtualmente. como, doPDF, entre otros que existen.
Porfis me puedes ayudar, me rompo la cabeza y nada, al diseñar el reporte ocupo 17.5 cm a lo ancho de la hoja A4, igual como tienes en la imagen de arriba, genero el reporte, si salen todos los datos pero al imprimir o visualizar es como que hace un zoom a los datos y no ocupa todo el tamaño de la hoja, y es un desperdicio de espacio tanto a la derecha como abajo, los datos según diseño se presentan todos, porfis sabes por qué pasa esto? porfis porfis gracias
porfis, a lo que armo el report viewer desde c#, respeto el ancho y margen indicado en la hoja A4, pero al presentar o enviar a imprimir deja bastante espacio a la derecha de la hoja es como que se achica la impresión pero ocupo con datos 18 cm y dejo 3 cm de margen 1.5 a cada lado y al imprimir deja 6 cm a la derecha. he revisado los parámetros y están bien definidos, alguien me puede ayudar? gracias
Estos procedimientos los podre realizar también en Visual Studio 2015 espero me puedas contestar soy nueva en este tema muchas gracias
Si podras, si tienes instalado reportviewer
Hola, tengo un problema, no me aparece el Informe para agregarlo a la solución, ¿será porque es Visual Studio 2019?
tengo el mismo problema que tu estoy en duda si es el visual studio 2019 o es porque es la version comunity
Hola! Yo estuve con el mismo inconveniente con el ReportViewer al empezar a trabajar con Visual Studio 2019 y logre solucionando siguiendo estos pasos:
(en realidad son un par de anotaciones que fui haciendo, las cuales fui obteniendo de diversas fuentes, se las comparto, por si les sirve):
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Video completo y explicado paso a paso:
============================================================
==========================================================
==========================================================
==========================================================
1. Ejecutar Visual Studio 2019
2. Ingresar al menu «Extensiones->Administrar Extensiones»
3. En el menú izquierdo seleccionar la opción «En Línea»
4. En el cuadro de búsqueda (arriba a la derecha) ingresar «report viewer»
5. Seleccionar la opción «Microsoft RDLC Report Designer»
6. Descargar e Instalar dicha opción
1. Click derecho en el Proyecto -> Administrar Paquetes NuGet
2. En la opción «Examinar», seleccionar:
a) «SqlServer.Types» y click en Instalar (click en Aceptar en todos los cuadros de diálogos)
b) «Report Viewer» (la opción de WinForm) y click en Instalar (click en Aceptar en todos los cuadros de diálogos)
3. Instalar el diseñador de Reporte, para ello:
a) Acceder al menú «Extensiones» -> Administrar Extensiones
b) En el menú de la izquierda, buscar dentro de la opción «En línea» el diseñador de reporte ingresando en la búsqueda las
letras «rdlc».
c) Seleccionar la opción «Microsoft RDLC Report Designer» y hacer click en «Descargar»
d) Esperar a que Visual Studio solicite cerrar la aplicación para que se instale la descarga del diseñador de reportes
El problema era que flataba incluir las 3 dll. Que se necesitan….
Y apesar de instalar el microsoftreportviewer.exe no copia las dll a la carpeta bin del sitio….
Hola como estás, las referencias que debes agregar son :
– Microsoft.ReportViewer.Common
– Microsoft.ReportViewer.WebForms
– Microsoft.ReportViewer.WinForms
Por lo tanto, para ello debemos hacer los siguientes pasos:
1. En visual studio ingresar al menu «Herramientas» -> Administrador de paquetes NuGet -> Consola Administrador:
[Seleccionar el Proyecto deseado en la sección «Proyecto predeterminado»], y escribir
PM> Install-Package Microsoft.ReportViewer.Common.v12 -Version 12.0.0.1
Luego, esperar que se instalen dichos componentes (Esta acción agregará automaticamente la Referencia a «Microsoft.ReportViewer.Common»)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Saludos! Espero les sirva…
podrías hacer un ejemplo idéntico pero para asp.net así mismo con c# y reportviewer, solo que esta vez queremos enviar un parámetro a la consulta. como por ejemplo el nombre o el número de cédula
Hola, todo bien hasta que selecciono la clase que quiere como objeto.
Me dice «Refencia a objeto no establecida como instancia de un objeto»
en c# en un report tengo una columna con palabras ser o no ser quiero que me cuente todas las palabras no ser, como lo hago gracias.-
Amigo, una pregunta esta solución solo está disponible para aplicaciones Windows, verdad??
Estuve en un proyecto con .Net Core y ahí haciamos los reportes con HTML y después los renderizabamos a PDF obviamente era un proceso muy complejo y tedioso de mantener.
Hola, no veo las clases que quiero usar como origen de datos, he visto que hay que Generar Solución o algo similar para tenerlas como origen de datos, pero no encunetro la manera de hacerlo en VS 2017.
¿Se os ocurre algo?
Solucionado cambiando la aplicacion a 32bits….
A mí no me lo solucciono
Rodrigo, Excelente Instructivo, ademas de que esta explicado claramente y en detalle, todo funciona como lo explicas.
Flaco busco conexion lingo con visual!! Gracias