2010-11-22 26 views
8

OK, creo que me estoy volviendo loco aquí ... Pensé que esto debería ser súper simple, pero no puedo entender cómo hacerlo.Usando el origen de datos de Objeto en ASP.NET 4 ReportViewer

Esto es lo que trato de hacer: Quiero crear un informe rdlc utilizando el control ReportViewer en ASP.NET 4 (VS 2010) y, como su fuente de datos, usar una clase con algunas propiedades. Intenté todo lo que pude pensar, pero no puedo resolverlo. Todos los documentos que encontré indican que el objeto debería aparecer en el panel de DataSource del sitio web, pero no puedo hacer que aparezca allí. Me gustaría que los campos de la clase aparezcan en el informe desiger para que pueda usarlos, pero tampoco puedo hacer eso. Al usar el diseñador, solo puedo definir un nuevo conjunto de datos: no quiero usar el conjunto de datos, ¡sino los objetos comerciales!

Entonces, ¿cómo puedo hacer eso? ¿Debo usar algún tipo de control DataSource? ¿Cómo puedo informar al diseñador del informe sobre el objeto comercial?

Gracias!

Memi

Respuesta

0

He encontrado this blog muy útiles.
Cuando crea un nuevo origen de datos para su rdlc, en el cuadro de diálogo Propiedades del conjunto de datos:
1) En el menú desplegable Fuente de datos, seleccione el espacio de nombres que contiene la clase que contiene el método público (vea el n. ° 2).
2) En la lista desplegable de conjuntos de datos disponibles, seleccione el método público que devuelve IQueryable de sus objetos comerciales.

0

¿Su clase de objeto de negocio está marcada como pública? He visto en un video que debe ser público.

4

¿siguió this tutorial?
todo lo que hay que hacer es:

  • definir sus clases DTO o generarla utilizando EF4 (por ejemplo)
  • definir sus clases de negocios con algunos métodos (como GetAll ...)
  • construir su solución (que es importante)

ahora de su diseñador de informes puede elegir los métodos de las clases de negocio como conjunto de datos y arrastrar y soltar el campo de las clases DTO
cuando elige ese informe para mostrar en el reportviewer, el objeto de fuente de datos se agregará para usted

-1

Tengo el mismo problema y encontré una forma de evitarlo. Por alguna razón, si desarrolla una aplicación ASP.NET, Microsoft quitó la función de agregar nueva fuente de datos. El camino no es genial, pero funciona. Uso todos los objetos y utilizo la biblioteca de Enterprise y quiero usar mis objetos para mis informes, solo tiene sentido por qué no te permiten hacerlo. No tengo idea de por qué Microsoft no permitiría esta funcionalidad para aplicaciones web.

Pero eso hace que las aplicaciones de Windows funcionen, así que lo que hice fue crear un proyecto de Windows separado para incluir mis objetos que quiero enlazar en ese proyecto y crear el informe en el proyecto de formularios. Luego llevo ese informe a mi aplicación web Asp.net y lo llamo por código. Aquí hay algunas piezas de código que utilizo para hacer esto. Esto está en VB pero podría convertirse a C#. También tengo una lista desplegable que selecciona el informe que se necesita y una declaración de caso que obtiene los datos.

Private Sub LoadReport() 

    Try 
     pnlReport.Visible = True 

     Dim Dal As New DataAccess 
     Dim objRptOutputData = New Model.RptClientCollection 
     Dim lr As LocalReport = OutputReportViewer.LocalReport 
     Dim rds As New ReportDataSource 

     lr.DataSources.Clear() 

     OutputReportViewer.Visible = True 
     OutputReportViewer.ProcessingMode = ProcessingMode.Local 
     OutputReportViewer.LocalReport.EnableHyperlinks = True 

     Dim SelectedReport As Integer = 0 

     If Me.ddlReport.SelectedItem.Value IsNot "" Then 
      SelectedReport = Me.ddlReport.SelectedItem.Value 
     End If 

    Select Case SelectedReport 
     Case ConstantEnum.Reports.ActiveWaitingList 

     objRptOutputData = Dal.GetRptClientsByStatus(ConstantEnum.Status.ActiveWaitingList) 
     lr.ReportPath = "Reporting\Report1.rdlc" 
     rds.Name = "dsClient" 
     rds.Value = objRptOutputData 
     Me.lblCount.Text = "Count: " & objRptOutputData.Count 
     Case ConstantEnum.Reports.InactiveWaitingList 
     ' This is a small app I have about 15 case statements if it was bigger I would of done this selection a bit different. 

     End Select 



     lr.DataSources.Add(rds) 
     lr.Refresh() 
     OutputReportViewer.DataBind() 

    Catch ex As Exception 
     ExceptionUtility.SendError(ex, "Reports", "LoadReport") 
    End Try 
End Sub 
Cuestiones relacionadas