My goal with this answer is to point in a possible direction as there is no way within the space of an answer that I can provide all the details required. Plus I suspect you will not want to use Crystal Reports that come free with Visual Studio, but that said Crystal, after learning it, worked great. The key part of this answer is to point out that I was able to set the DataSource in code; hopefully, you can find a similair way with your report control. Finally the benefits of Crystal included the ability to print and save to PDF that I got for free.
I did this project a few years ago so I used Winforms.
Here are some of the key code fragments that made it possible.
Here are two Crystal Reports classes that I used:
private CrystalReportViewer crystalReportViewer_;
private CrystalReport1 crpt_;
Here I load the Crystal Report in my code by building my own Data Source:
// I omited how to fill the data set.
DataSet ds = new DataSet();
crpt_.SetDataSource(ds.Tables[0]);
crystalReportViewer_.ReportSource = crpt_;
// need to load parametes after setting the report data source
// to prevent the enter parameters dialog from opening...
LoadParameterValues(crpt_);
crystalReportViewer_.Show();
Here is an example of how to load parameters in the Crystal Report:
private void LoadParameterValues(CrystalReport1 crpt)
{
ParameterValues currentParameterValues = new ParameterValues();
ParameterFieldDefinitions parameterFieldDefinitions = crpt.DataDefinition.ParameterFields;
ParameterDiscreteValue parameterDiscreteValue1 = new ParameterDiscreteValue();
parameterDiscreteValue1.Value = statementDate.Value;
currentParameterValues.Add(parameterDiscreteValue1);
ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions["statementDate"];
parameterFieldDefinition.ApplyCurrentValues(currentParameterValues);
ParameterDiscreteValue parameterDiscreteValue2 = new ParameterDiscreteValue();
parameterDiscreteValue2.Value = dueDate.Value;
currentParameterValues.Add(parameterDiscreteValue2);
ParameterFieldDefinition parameterFieldDefinition2 = parameterFieldDefinitions["dueDate"];
parameterFieldDefinition2.ApplyCurrentValues(currentParameterValues);
}
I can provide more detail if you go down this path.