none
Como configurar un report viewer por código

    Question

  • Hola!

     

    Estoy programando una aplicación en la cual quiero usar un report viewer, pero a lo que he visto, siempre tengo que configurarlo con los asistentes de Visual Studio, lo que yo quiero hacer es configurarlo todo por código pero no estoy seguro de como hacerlo.

     

    Tengo una ventana con el control del reporte, y mi informe (el que le dara el diseño) y un dataset, pero no se como podría configurar todo por código para nadamas cargar el reporte y se visualise según una sentencia SQL que yo defina.

     

    Gracias a quién me pueda orientar, saludos!

     

     

    Monday, November 14, 2011 4:22 AM

Answers

All replies

  • Hola Victor,

    En este link tienes un ejemplo http://csharpshooter.blogspot.com/2007/08/generate-rdlc-dynamically-for-vs-2005.html.

    Ahora si quieres dos consejos.

    1. No trabajaría con DataSet sino con clases y por tanto a partir de aquí el origen de datos del Report sería un List<T> donde T es del tipo de tu clase (Simplemtente es más optimo).

    2. Generaría los report con el diseñador. Eso sí en una dll aparte generaría todos mis rdlc y si puede ser en otra las clases que van a ser origenes de datos.

    Saludos,


    phurtado
    Monday, November 14, 2011 10:54 AM
    Moderator
  • hola

    algo como esto

    [Reporting Service] Campo Imagen desde un DataSet Tipados

     

    en donde si analisas el codigo veras que se define la asignacion del origen de datos y del .rdlc desde codigo

                ReportDataSource dataSourceEmpresa = new ReportDataSource("Productos_Empresa", LogoEmpresa());
                reportViewer1.LocalReport.DataSources.Add(dataSourceEmpresa);

                ReportDataSource dataSourceProductos = new ReportDataSource("Productos_Productos", ObtenerLista());
                reportViewer1.LocalReport.DataSources.Add(dataSourceProductos);

                reportViewer1.LocalReport.ReportPath = Path.Combine(Application.StartupPath, "ListadoProductos.rdlc");

                reportViewer1.RefreshReport();

    alli no se usa ningun asistente para asignar los datos o el reporte al control Viewer

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, November 14, 2011 11:45 AM
  • Hola Leandro, ando implementando la solución que me diste con un código coo este:

     

     

            private void Form1_Load(object sender, EventArgs e)
            {
                ReportDataSource dataSourceHorario = new ReportDataSource("f", ObtenerDatosReporte());            
            }
    
            private JornadaLaboral.JornadasLaboralesDataTable ObtenerDatosReporte()
            {
                JornadaLaboral.JornadasLaboralesDataTable TablaHorarios = new JornadaLaboral.JornadasLaboralesDataTable();
                JornadaLaboral.JornadasLaboralesRow Fila = TablaHorarios.NewJornadasLaboralesRow();
    
                Fila.idEmpleado = 333;
                Fila.FechaDiaTrabajo = DateTime.Now;
                Fila.HoraEntrada = DateTime.Now;
                Fila.HoraSalida = DateTime.Now;
                TablaHorarios.Rows.Add(Fila);
    
                Fila = TablaHorarios.NewJornadasLaboralesRow();
    
                Fila.idEmpleado = 444;
                Fila.FechaDiaTrabajo = DateTime.Now;
                Fila.HoraEntrada = DateTime.Now;
                Fila.HoraSalida = DateTime.Now;
                TablaHorarios.Rows.Add(Fila);
    
                Fila = TablaHorarios.NewJornadasLaboralesRow();
    
                Fila.idEmpleado = 555;
                Fila.FechaDiaTrabajo = DateTime.Now;
                Fila.HoraEntrada = DateTime.Now;
                Fila.HoraSalida = DateTime.Now;
                TablaHorarios.Rows.Add(Fila);
    
                return TablaHorarios;
            }
    

     


    Sin embargo VS me marca un error que describe lo siguiente:

    Error    1    La llamada es ambigua entre los siguientes métodos o propiedades: 'Microsoft.Reporting.WinForms.ReportDataSource.ReportDataSource(string, System.Data.DataTable)' y 'Microsoft.Reporting.WinForms.ReportDataSource.ReportDataSource(string, System.Collections.IEnumerable)'    D:\Proyectos de Software\GRH\GRH\Reportes\frmReporte.cs    22    50    Reportes

    Esto me lo manda en la línea del Form1_Load

    Y no se a que se deba ¿Podrías ayudarme? Gracias!


    Thursday, November 17, 2011 8:52 PM
  • Hola Victor,

    Mira este link del foro donde se resolvió este problema

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/c8605342-2bf5-450b-b5c5-8b0e9a64a59c

     

    Saludos,


    phurtado
    • Marked as answer by Víctor Moreno Friday, November 18, 2011 5:32 PM
    Thursday, November 17, 2011 9:19 PM
    Moderator
  • Woow, solo le hice el cast y no me mando error, gracias!
    Friday, November 18, 2011 5:32 PM
  • Leandro, Pedro o quien sea jejeeje:

    Resulta que creado mi propio código pero todavia no logro obtener mi reporte, este es mi código:

            private void Form1_Load(object sender, EventArgs e)
            {
                ReportDataSource dataSourceHorario = new ReportDataSource("Horario", (DataTable)ObtenerDatosReporte());
                reportJornadas.LocalReport.DataSources.Add(dataSourceHorario);

                ////reportJornadas.LocalReport.ReportPath = Path.Combine(Application.StartupPath, "DiseñoReporte.rdlc");
                reportJornadas.LocalReport.ReportPath = "D:\\Proyectos de Software\\GRH\\GRH\\Reportes\\DiseñoReporte.rdlc";
                reportJornadas.RefreshReport();
            }

            private Horario.JornadasLaboralesDataTable ObtenerDatosReporte()
            {
                Horario.JornadasLaboralesDataTable TablaHorarios = new Horario.JornadasLaboralesDataTable();
                Horario.JornadasLaboralesRow Fila = TablaHorarios.NewJornadasLaboralesRow();

                Fila.idEmpleado = 333;
                Fila.FechaDiaTrabajo = DateTime.Now;
                Fila.HoraEntrada = DateTime.Now;
                Fila.HoraSalida = DateTime.Now;
                TablaHorarios.Rows.Add(Fila);

                Fila = TablaHorarios.NewJornadasLaboralesRow();

                Fila.idEmpleado = 444;
                Fila.FechaDiaTrabajo = DateTime.Now;
                Fila.HoraEntrada = DateTime.Now;
                Fila.HoraSalida = DateTime.Now;
                TablaHorarios.Rows.Add(Fila);

                Fila = TablaHorarios.NewJornadasLaboralesRow();

                Fila.idEmpleado = 555;
                Fila.FechaDiaTrabajo = DateTime.Now;
                Fila.HoraEntrada = DateTime.Now;
                Fila.HoraSalida = DateTime.Now;
                TablaHorarios.Rows.Add(Fila);

                return TablaHorarios;
            }

    Considereciones:

    - Agregue por medio de visual studio (agregar nuevo elemento) un dataset llamado Horario.xsd

    - Agregue un reporte o diseño de informe llamado DiseñoReporte.rdlc, que no tiene ningun elemento adentro.

    A lo que entiendo en mi código de ObtenerDatosReporte, estoy llenando de información el reporte, pero con datos que yo me estoy inventando, no son directamente de una tabla de la base de datos

    Para esta linea:

                ReportDataSource dataSourceHorario = new ReportDataSource("Horario", (DataTable)ObtenerDatosReporte());

    Mis preguntas

    1.- El primer parámetro no se si se llame solamente Horario (que es mi DataSet) o tenga que llevar otro nombre junto con el de mi tabla que contiene.

    2.- Como podría manejar una sentencia SELECT * from TABLA Where misCondiciones en ese código

    3.- Cuando agrego un elemento tabla al diseñador pareciera ser que siempre tengo que poner un origen de datos, pero se supone  que eso se esta configurando desde código no?? VS me obliga a usar un origen de datos si la tabla no tiene uno.

    Estoy usando Visual Studio 2010, no se si me puedan decir que debo de cambiar a mi código o en la tabla del diseñador, gracias!
    Saturday, November 19, 2011 11:42 PM