Walkthrough: Simple Subreports
ActiveReports allows reports to contain any number of child reports by using the Subreport control. Child reports, or subreports, are executed each time the parent section (i.e. the section in which the Subreport control is placed) is printed.
Note: Subreports will not render PageHeader/Footer sections, so you can delete them to save on processing time.
This walkthrough illustrates how to set up a bound subreport by setting the Subreport control's Report property to the child report and how to modify the subreport record source from the data in the parent report to retrieve the correct information.
This walkthrough is split up into the following activities:
- Adding two ActiveReports to a Visual Studio project
- Connecting the parent report to a data source
- Adding controls to display the data
- Adding the code needed to save the current record's CategoryID to use in the subreport's SQL query
- Adding the code to create a new data source, setting its connection string, setting its SQL query and setting the new data source equal to the subreport's data source
- Viewing the report
To complete the walkthrough, you must have access to the NorthWind database (NWind.mdb).
When you have finished this walkthrough, you will have a report that looks similar to the following.
Adding two ActiveReports to a Visual Studio project
To add two ActiveReports to a Visual Studio project
- Open a new project in Visual Studio.
- Click on Project > Add New Item.
- Select ActiveReports file and rename the file rptMain.
- Click Open.
- Click on Project > Add New Item.
- Select ActiveReports file and rename the file rptSub.
- Click Open.
Connecting the parent report to a data source
To connect the parent report to a data source
- Click on the yellow report DataSource icon in the Detail section. This brings up the report DataSource dialog box.
- Click on Build...
- Select Microsoft Jet 4.0 OLE DB Provider and click Next >>
- Click on the ellipsis to browse for the access path to NWind.mdb. Click Open once you have selected the appropriate access path.
- Click OK to continue.
- In the Query field, type "Select * from categories".
- Click OK to return to the report design surface.
Adding controls to display the data
To add controls to the reports
- Add the following controls to the Detail section of rptMain, naming them as indicated:
Control |
DataField |
Name |
Text/Caption |
Location |
Label |
(Empty string) |
lblProducts |
Products |
1.0625, 0.25 |
Label |
(Empty string) |
lblCategoryName |
Category Name: |
0, 0 |
TextBox |
CategoryName |
txtCategoryName |
CategoryName |
1.06, 0 |
Subreport |
(Empty string) |
ctlSubreport |
(Empty string) |
1.0625, 0.5 |
- Add the following controls to the Detail section of rptSub, naming them as indicated:
Control |
DataField |
Name |
Text/Caption |
Location |
TextBox |
ProductName |
txtProductName |
ProductName |
1.187, 0.06 |
Label |
(Empty string) |
lblProductName |
Product Name: |
0.06, 0.06 |
Adding the code needed to save the current record's categoryID
Note: The Fields collection should never be accessed outside the DataInitialize and FetchData events.
To write the code in Visual Basic
- Right-click in any section of the design window of rptMain, and click on View Code to display the code view for the report. At the top left of the code view for rptMain, click the drop-down arrow and select (Base Class Events). At the top right of the code window, click the drop-down arrow and select FetchData. This creates an event-handling method for rptMain's FetchData event. Add code to the handler to:
- Save the current record's categoryID to use in the subreport's SQL query
To write the code in C#
- Click in the gray area below rptMain to select the report. Click on the events icon in the Properties window to display available events for the report. Double-click FetchData. This creates an event-handling method for rptMain's FetchData event. Add code to the handler to:
- Save the current record's categoryID to use in the subreport's SQL query
The following example shows what the code for the method looks like.
' Visual Basic
Dim m_categoryID As String
Private Sub rptMain_FetchData(ByVal sender As Object, ByVal eArgs As DataDynamics _
.ActiveReports.ActiveReport.FetchEventArgs) Handles MyBase.FetchData
m_categoryID = Me.Fields("CategoryID").Value
End Sub
//C#
string m_categoryID;
Private Void rptMain_FetchData(object sender, DataDynamics.ActiveReports.ActiveReport.
FetchEventArgs eArgs)
{
m_categoryID = Fields["CategoryID"].Value.ToString();
}
Adding the code to create a new data source
To write the code in Visual Basic
- Right-click in any section of the design surface of rptMain, and click on View Code to display the code view for the report. At the top left of the code view for rptMain, click the drop-down arrow and select rptMain. At the top right of the code window, click the drop-down arrow and select Detail_Format. This creates an event-handling method for the report's Detail_Format event. Add code to the handler to:
- Create a new DataDynamics OleDBDataSource
- Set the new data source's connection string
- Set the new data source's SQL query
- Set the subreport's data source equal to the new data source
To write the code in C#
- Click in the Detail section of rptMain to select the section. Click on the events icon in the Properties window to display available events for the Detail section. Double-click Format. This creates an event-handling method for rptMain's Detail_Format event. Add code to the handler to:
- Create a new DataDynamics OleDBDataSource
- Set the new data source's connection string
- Set the new data source's SQL query
- Set the subreport's data source equal to the new data source
The following example shows what the code for the method looks like.
' Visual Basic
Private Sub Detail_Format(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Detail.Format
Dim rpt As New rptSub()
Dim subDS As New DataDynamics.ActiveReports.DataSources.OleDBDataSource()
subDS.ConnectionString = Me.ds.ConnectionString
subDS.SQL = "Select * from products where categoryID = " + m_categoryID
rpt.DataSource = subDS
Me.ctlSubreport.Report = rpt
End Sub
//C#
private void Detail_Format(object sender, System.EventArgs eArgs)
{
rptSub rpt = new rptSub();
DataDynamics.ActiveReports.DataSources.OleDBDataSource subDS = new DataDynamics.
ActiveReports.DataSources.OleDBDataSource();
subDS.ConnectionString = this.ds.ConnectionString;
subDS.SQL = "Select * from products where categoryID = " + m_categoryID;
rpt.DataSource = subDS;
ctlSubReport.Report = rpt;
}
Viewing the report
To view the report
- Add the ActiveReports viewer control to a Windows Form.
- Add the code needed to set the viewer document equal to the report document. See Using the ActiveReports WinForm Viewer for help.
Samples | Walkthroughs
Copyright © 2004-2005 Data Dynamics, Ltd. All rights reserved.