Displaying WCF Data Service data in local reports
Its been sometime that I have blogged. I recently got asked by one of my peers on how to display the data from DataService on a local report and how to pass a parameter .
Its relatively easy to do this , the steps would be
- Make a connection to the DataService using Data Service client API
- Get the Data as a collection , my favorite List<T> :)
- Add it to the ReportDataSource and bind it to the LocalReport
However, regarding the parameter passing , we know that if we add a parameter to the local report it does not prompt for the user and the developer is responsible for getting the value. Also you need to decide whether you need to get the entire data on the client and then do a filter on it or if you want to get the filtered data from the server based on the parameter selected from the client. I took the former approach and get the entire data(considering the small amount of data that I have ). Here is how
I am assuming that you already have a neat WCF Data Service defined and ready to take the requests, in this case at https://localhost:54560/MyDataService/NorthwindService.svc/ . If you are new to this then I suggest you take a look at Getting Started with Data Services section on MSDN
In order to code the client lets first create a Data Service proxy using the tool DataSvcUtil.exe . Open up Visual Studio command prompt and type the following
c:\Users\bindeshv>DataSvcUtil /out:NorthwindService.cs /language:CSharp /uri:https://localhost:54560/MyDataService/NorthwindService.svc/
Next go ahead and add this to your WinForms project as an existing item. Once done you need to add the Using reference to the newly added chsarp namespace.
Add a RDLC file to the project as shown below
Next we need to define the data source for the local report. In order to do that bring up the Data Sources explore (from Visual Studio Menu , Data > Show Data Sources) and then click on Add New Data Source in the Data Source Explorer. This will start a wizard and in the first window choose Service as the Data Source type and in the next window type in the url of your WCF Data Service as shown below and click Go
Go ahead and give a namespace and then click on OK button. Once the service reference is added to the project and since WCF Data Services exposes entity you need to choose the object that you will bind the report to. In order to do this again go to the Data Source Explorer and then Add a new Data Source but this time choose Object instead of service and point it to the WCF Service that was added to the project like shown below
Once the object is added to the Data Source Explore you can proceed with the normal design of the report by dragging in a table component and then adding the necessary fields
Now we need to add the Report Parameter, in this case I will specify the Employee ID as input for filtering , so that we see details of only one specific employee. In the Visual Studio Menu option go ahead and chose Report > Report Parameters.. and the required parameter
Once the parameter is defined you need to specify it in the Reports Table Properties Filter section as shown below
Once the filtering is done go ahead and add a Report Viewer control to the form. Remember we need to device our own parameter for Reports in case of local report. Here is how my form looks after the design is done
And here is how the code behind looks like
//Form level member
private List<Employees> empList = null ;
private void Form1_Load(object sender, EventArgs e)
{
if (empList == null)
{
NorthwindModel.NorthwindEntities entitiesContext = new NorthwindModel.NorthwindEntities(new Uri("https://localhost:54560/MyDataService/NorthwindService.svc/"));
try
{
empList = (from emps in entitiesContext.Employees
select emps).ToList<Employees>();
ReportDataSource rds = new ReportDataSource("DataServiceForms_NorthwindReference_Employees", empList);
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(rds);
}
catch (Exception _ex)
{
MessageBox.Show(_ex.Message);
}
}
//get all the employee ids and bind it
var empIDs = from emps in empList
select emps.EmployeeID;
foreach (int i in empIDs)
{
this.comboBox1.Items.Add(i);
}
//set the combo to display the first item
this.comboBox1.SelectedIndex = 0;
//bind parameters to the report
BindParameter();
}
private void BindParameter()
{
ReportParameter param = new ReportParameter("EmpID", this.comboBox1.SelectedItem.ToString());
this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { param });
this.reportViewer1.RefreshReport();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
BindParameter();
}
The completed report looks like this
Until next post ..