0

I am trying to bind a XtraReport to a BindingSource (instead of a Dataset) and want to filter the values in the datasource before they get to the report using report parameters.

I have already declared the parameters and the bindingsource in the report designer. So I have the fields and everything set.

According to this article I can now load the collection in the Load event of a Windows form. But I don't want that.

In other words, the report should not load all rows from the custom StoreCollection (a List<T> of custom Store types), but only those determined by the parameters.

How would I do accomplish this?

Note: I know the BindingSource has a Filter property, but I am not sure how I would pass my parameters to it (the parameters are used to retrieve data form the database and a List of custom types is returned).

Thank you.

John
  • 3,591
  • 8
  • 44
  • 72
  • Create an object to contain the values. Populate a list of these objects using LINQ and set the XtraReport's data source to that of the list of objects. Rebuild the project, then within the xtrareport drop a 'Binding Source' and set it's source to the data object (not the list), then drag and drop the 'fields' onto the report. Will post code in the morning if this is useful – Chris Aug 01 '13 at 22:55

1 Answers1

0

I would use LINQ to select the data before it goes into the report. My code is in VB.net but can fairly easily be translated:

1 - Create a data object - that will contain our data

Public Class Animal
    Public name As String
    Public livesYears As Integer
    Public location As String
End Class

2 - Create the XtraReport1. Drop a BindingSource onto the designer and set it's DataSource to Animal. If Animal doesn't show up in the list that the wizard generates, you will need to rebuild your solution. Drop a couple of the Fields onto the designer... 'name' etc so that the report will have something to... report!

3 - Create sub to populate the list

Private Function createAnimals() As List(Of Animal)
    Dim allAnimals As New List(Of Animal)

    allAnimals.Add(New Animal With {.name = "Snake", .livesYears = "12", .location = "Africa"})
    allAnimals.Add(New Animal With {.name = "Dog", .livesYears = "17", .location = "England"})
    allAnimals.Add(New Animal With {.name = "Cat", .livesYears = "14", .location = "Egypt"})
    allAnimals.Add(New Animal With {.name = "Hedgehog", .livesYears = "4", .location = "England"})
    allAnimals.Add(New Animal With {.name = "Dragon", .livesYears = "350", .location = "Canada"})
    allAnimals.Add(New Animal With {.name = "Bat", .livesYears = "28", .location = "Scotland"})

    Return allAnimals
End Function

4 - Create an instance of the report in the Form Load

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

    'create our list of animals (could be a for loop that adds each dataset row to the list of Animal)
    Dim allAnimals As List(Of Animal) = createAnimals()

    'select just the Animals that we want
    Dim justTheAnimalsIWant = (From ani In allAnimals
                              Where ani.location = "England"
                              Select ani).ToList

    'create instance of the report
    Dim report As New XtraReport1

    'set the datasource to justTheAnimalsIWant
    report.DataSource = justTheAnimalsIWant

    Dim printTool As ReportPrintTool = New ReportPrintTool(report)
    printTool.ShowPreview()
End Sub

The above example doesn't use a dataset, it uses a list of our Animal objects. To populate our list of Animal objects you could use a for loop to iterate through the data-rows and add to the list of Animal objects. Then after use LINQ to select what you want, just like with the justTheAnimalsIWant. Simples.

Chris
  • 5,516
  • 1
  • 26
  • 30