none
Crear un solo método para representar todos los informes RRS feed

  • Pregunta

  • Hola a todos, estoy creando una aplicación WPF que incluye un conjunto de informes RDLC, y para resolverlo quiero crear un único control de usuario que incluye un WindowsFormHost que incluye un control ReportView en su interior y dentro del código del control del código de usuario creo todos los objetos necesarios para pintar el informe, ya lo he probado con un primer informe y funciona, pero ahora quiero parametrizar todos los datos del informe, nombres, DataSet etc. para que con este único control de usuario pueda resolver los demás informes, y no tengo problemas con los nombres pero si con el TableAdapter, al ser un objeto particular para cada informe no encuentro como definirlo de una forma genérica y luego darle su tipo real en cada informe

    algo así como definirlo a nivel global como de tipo objeto   =>  object TAdapter;

    y luego en el switch del informe para cada informe => TAdapter as DataSet1TableAdapter = new  DataSet1TableAdapter()

    pero esto no funciona y no consigo parametrizarlo, y debe haber alguna forma, a ver si me podeis echar un cable.

    Gracias

     
    domingo, 9 de agosto de 2015 17:53

Respuestas

  • Al Report le puedes pasar los datos mediante un DataTable no-tipado, que al fin y al cabo es lo que contine dentro el TableAdapter (junto con los mecanismos para cargarlo). En tu control de usuario, simplemente expón una propiedad pública de tipo DataTable y en el "setter" asígnale el DataTable al Report. Desde fuera, cuando uses el control de usuario, pásale el DataTable previamente cargado de datos mediante el mecanismo que consideres más adecuado, por ejemplo, mediante un TableAdapter.
    lunes, 10 de agosto de 2015 8:38
    Moderador
  • Lo analizaré, gracias Alberto
    • Marcado como respuesta fjjcent lunes, 10 de agosto de 2015 19:38
    lunes, 10 de agosto de 2015 19:38

Todas las respuestas

  • Al Report le puedes pasar los datos mediante un DataTable no-tipado, que al fin y al cabo es lo que contine dentro el TableAdapter (junto con los mecanismos para cargarlo). En tu control de usuario, simplemente expón una propiedad pública de tipo DataTable y en el "setter" asígnale el DataTable al Report. Desde fuera, cuando uses el control de usuario, pásale el DataTable previamente cargado de datos mediante el mecanismo que consideres más adecuado, por ejemplo, mediante un TableAdapter.
    lunes, 10 de agosto de 2015 8:38
    Moderador
  • Lo analizaré, gracias Alberto
    • Marcado como respuesta fjjcent lunes, 10 de agosto de 2015 19:38
    lunes, 10 de agosto de 2015 19:38
  • Alberto no funciona, el problema es que la clase TableAdapter no existe, y el objeto que creas al crear el DataSet incluye no solo las tablas o tabla (los DataTable) que utilizas para el informe sino también el enlace con la base de datos y las consultas (querys), lo que lo convierte en un objeto único y no hay forma de hacerle un casting para recogerlo como parámetro, he probado con MarshalByRef, con System.ComponentModel.Component y se pierden los métodos de la clase, porque ademas para muchas funcionalidades utiliza REFLEXION, por ejemplo para llenar el ReportView necesita que le especifiques la tabla en formato DataSet.NombreTabla y no le vale DataSet.Tables[0] por lo que la cosa es bastante complicada, y efectivamente el tema no está cerrado.

    un saludo

     
    domingo, 16 de agosto de 2015 18:06
  • No, creo que no has entendido lo que yo decía. Mi idea era que desde fuera del método que vas a crear instancies el TableAdapter y llames a su método GetData, que te devuelve un LoQueSeaDataTable. Este objeto sí que hereda de DataTable, y se lo puedes pasar a un método genérico que reciba un DataTable. Y dentro del método, ese DataTable se lo asignas al dataset del report, que lo debería admitir sin ningún problema.
    lunes, 17 de agosto de 2015 8:16
    Moderador