ActiveReports Developer supports field merged reports using the RichText control. The RichText control can contain field place holders that can be replaced with values (merged) at run time. This walkthrough illustrates how to create a mail-merge report using the RichText control.
This walkthrough is split up into the following activities:
- Adding an ActiveReports to the Visual Studio project
- Connecting the report to a data source
- Adding controls and formatting the report
- Adding fields and text to the RichText control
- Using the FetchData event to conditionally format data
- Adding code to update RichText fields with current date and conditional values
- Adding code to send the group subtotal value to the RichText field
- Viewing the report
Note: This walkthrough uses the Northwind database. By default, in ActiveReports, the Northwind.mdb file is located at [User Documents folder]\ComponentOne Samples\ActiveReports Developer 7\Data\NWIND.mdb. |
When you complete this walkthrough you get a layout that looks similar to the following at design time and at runtime.
Design Time Layout
Runtime Layout
To add an ActiveReport to the Visual Studio project
- Create a new Visual Studio project.
- From the Project menu, select Add New Item.
- In the Add New Item dialog that appears, select ActiveReports 7 Section Report (code-based) and in the Name field, rename the file as rptLetter.
- Click the Add button to open a new section report in the designer.
See Adding an ActiveReport to a Project for information on adding different report layouts.
To connect the report to a data source
- On the detail section band, click the Data Source Icon.
- In the Report Data Source dialog that appears, on the OLE DB tab, next to Connection String, click the Build button.
- In the Data Link Properties window that appears, select Microsoft Jet 4.0 OLE DB Provider and click the Next button to move to the Connection tab.
- Click the ellipsis (...) button to browse to your database, for example the NWind.mdb sample database. Click Open once you have selected the appropriate database path.
- Click the Test Connection button to see if you have successfully connected to the database.
- Click OK to close the Data Link Properties window and return to the Report Data Source dialog. Notice that the Connection String field gets filled automatically.
- In the Query field on the OLE DB tab, enter the following SQL query.
SQL Query Copy Code SELECT Customers.CustomerID, Customers.CompanyName, Customers.ContactName, Customers.Address, Customers.City, Customers.Region, Customers.Country, Customers.PostalCode, Orders.OrderID, Orders.OrderDate, [Order Subtotals].Subtotal
FROM Customers INNER JOIN ([Order Subtotals] INNER JOIN Orders ON [Order Subtotals].OrderID = Orders.OrderID) ON Customers.CustomerID = Orders.CustomerID - Click OK to save the data source and return to the report design surface.
To create a layout for the report
- On the design surface of the report, right-click and select Insert, then Group Header/Footer to add group header and footer sections.
- On the design surface, select the grey area outside the report and in the Properties window, set the PrintWidth property to 6.5.
- Select the group header and in the Properties window, set the properties as follows.
Property Name Property Value DataField CustomerID Height 2.5 KeepTogether True - On the design surface of the report, select the group footer section and in the Properties window, set the following properties.
Property Name Property Value Height 1.1 KeepTogether True NewPage After - On the design surface of the report, select the detail section and in the Properties window, set the CanShrink property to True.
- On the design surface of the report, select the pageHeader section and in the Properties window, set the following properties.
Property Name Property Value Height 0.8 BackColor Coral - From the toolbox, drag the Label control to the pageHeader section and in the Properties window, set the properties as follows.
Property Name Property Value Location 0, 0 in Size 6.5, 0.65 in Text ComponentOne Font Size 36 Font Bold True - In the Report Explorer, expand the Fields node, then the Bound node. Drag the SubTotal field onto the groupHeader section and in the Properties window, set the following properties.
Property Name Property Value Location 4, 0 in Size 1, 0.2 in Name txtSubtotal1 OutputFormat Currency Visible False SummaryType SubTotal SummaryGroup GroupHeader1 Note: Even though txtSubtotal1 is hidden, setting its properties is important as it provides the value and the formatting that is displayed in the RichText control. - From the toolbox, drag the following controls to the groupHeader section and in the Properties window, set the properties as follows.
Property Name Property Value Location 0, 0 in Size 6.5, 2.1 in AutoReplaceFields True Property Name Property Value Location 0.875, 2.25 in Size 1, 0.2 in Text Order ID Font Bold True Property Name Property Value Location 1.875, 2.25 in Size 1, 0.2 in Text Order Date Font Bold True Property Name Property Value Location 4.375, 2.25 in Size 1, 0.2 in Text Amount Font Bold True Alignment Right - In the Report Explorer, expand the Fields node, then the Bound node. Drag the following fields onto the detail section and in the Properties window, set the properties of each textbox as follows.
Property Name Property Value Location 0.875, 0 in Size 1, 0.2 in Property Name Property Value Location 1.875, 0 in Size 1, 0.2 in OutputFormat MM/dd/yy Property Name Property Value Location 4.375, 0 in Size 1, 0.2 in OutputFormat Currency Alignment Right - From the toolbox, drag the following controls to the groupFooter section and in the Properties window, set the properties as follows.
Property Name Property Value Location 5.15, 0.15 in Size 1.35, 0.2 in Text Best regards, Alignment Right Property Name Property Value Location 5.15, 0.8 in Size 1.35, 0.2 in Text Accounts Receivable - From the toolbox, drag a Label control to the pageFooter section and in the Properties window, set the properties as follows.
Property Name Property Value Location 0, 0 in Size 6.5, 0.2 in Text GrapeCity, 401 Parkplace, Suite 411, Kirkland, WA 98033 Alignment Center
To add fields to the RichText control
- Double-click the RichTextBox control box and delete the default text.
- Right-click the box and choose Insert Fields.
- In the Insert Field dialog that appears, enter Date and click OK.
- Place the cursor in front of the text [!Date] that appears in the RichText control, and add spaces until the text is at the right edge of the control (but not overlapping to the next line).
- Place the cursor at the end of the text, and press the Enter key to move to the next line.
- Insert each of the following fields using the Insert Field dialog (see design time image above for fields arrangement):
- CompanyName
- ContactName
- Address
- City
- Region
- Country
- PostalCode
- SubTotal
- Add the following text to the RichText control box after all of the fields.
Paste into the RichText control Copy Code Dear [!ContactName], Thank you for your business. Below is a list of your orders for the past year with a total of [!SubTotal]. Please take this opportunity to review each order and total for accuracy. Call us at 1-800-DNT-CALL with any questions or concerns.
- Arrange the text and fields within the control as you would in any text editor.
To use the FetchData event to conditionally format data
To write the code in Visual Basic
- At the top left of the code view for the report, click the drop-down arrow and select (rptLetter Events).
- At the top right of the code window, click the drop-down arrow and select FetchData. This creates an event-handling method for the report's FetchData event.
- Add code to the handler to add a comma and a space if there is a Region value for the customer's address.
The following example shows what the code for the method looks like.
Visual Basic.NET code. Paste JUST ABOVE the FetchData event. | Copy Code |
---|---|
Dim region As String |
Visual Basic.NET code. Paste INSIDE the FetchData event. | Copy Code |
---|---|
'If there is no region for the customer, display nothing If Fields("Region").Value Is System.DBNull.Value Then region = "" Else 'If there is a region, add a comma and a space region = ", " + Fields("Region").Value End If |
- Back in design view, click in the gray area below the report to select it.
- Click the events icon in the Properties window to display available events for the report.
- Double-click FetchData. This creates an event-handling method for the report's FetchData event.
- Add code to the handler to add a comma and a space if there is a Region value for the customer's address.
The following example shows what the code for the method looks like.
C# code. Paste JUST ABOVE the FetchData event. | Copy Code |
---|---|
string region; |
C# code. Paste INSIDE the FetchData event. | Copy Code |
---|---|
if(Fields["Region"].Value is System.DBNull) region = ""; else region = ", " + Fields["Region"].Value.ToString(); |
To add code to update RichText fields with the current date and conditional values
- Double-click in the group header section of the report to create an event-handling method for the group header's Format event.
- Add code to the handler to:
- Replace the Date field in the RichText control with the current system date
- Replace the Region field with the conditional value created in the FetchData event
To write the code in Visual Basic.NET
Visual Basic.NET code. Paste INSIDE the Group Header Format event. | Copy Code |
---|---|
'Use the current date in the letter Me.RichTextBox1.ReplaceField("Date", System.DateTime.Today.Date.ToShortDateString()) 'Use the value returned by the FetchData event Me.RichTextBox1.ReplaceField("Region", region) |
C# code. Paste INSIDE the Group Header Format event. | Copy Code |
---|---|
//Use the current date in the letter this.richTextBox1.ReplaceField("Date", System.DateTime.Today.Date.ToShortDateString()); //Use the value returned by the FetchData event this.richTextBox1.ReplaceField("Region", region); |
To add code to send the group subtotal value to the RichText field
To write the code in Visual Basic.NET
- Right-click in any section of the design window of rptLetter, and click on View Code to display the code view for the report.
- At the top left of the code view for rptLetter, click the drop-down arrow and select GroupHeader1.
- At the top right of the code window, click the drop-down arrow and select BeforePrint. This creates an event-handling method for rptLetter's GroupHeader1_BeforePrint event.
Note: We use the BeforePrint event instead of the Format event to get the final value of the subtotal field just prior to printing. For more information on section event usage, see the Section Events topic. - Add code to the handler to replace the value of the Subtotal field in the RichText control with the value of the hidden textbox in the group header.
Visual Basic.NET code. Paste INSIDE the Group Header BeforePrint event. Copy Code 'Use the value from the hidden group subtotal field Me.RichTextBox1.ReplaceField("SubTotal", Me.txtSubtotal1.Text)
- Back in design view, click the group header section to select it.
- Click the events icon in the Properties window to display available events for the group header.
- Double-click BeforePrint. This creates an event-handling method for the report's BeforePrint event.
Add code to the handler to replace the value of the Subtotal field in the RichText control with the value of the hidden textbox in the group header.
The following example shows what the code for the method looks like.C# code. Paste INSIDE the Group Header BeforePrint event. Copy Code //Use the value from the hidden group subtotal field this.richTextBox1.ReplaceField("SubTotal", this.txtSubtotal1.Text);
- Click the preview tab to view the report at design time.
OR
- Open the report in the Viewer. See Using the Viewer for further information.