ActiveReports 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:
- 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
![]() |
Tip: For basic steps like adding a report to a Visual Studio project and viewing a report, please see the Basic Data Bound Reports walkthrough. |
To complete the walkthrough, you must have access to the Northwind database.
A copy is located at C:\Program Files\GrapeCity\ActiveReports 6\Data\NWIND.MDB (on a 64-bit Windows operating system, a copy is located in C:\Program Files (x86)\GrapeCity\ActiveReports 6\Data\NWIND.MDB).
When you complete this walkthrough, you will have a report that looks similar to the following:
To connect the report to a data source
- Add a reports to a Visual Studio project, naming it rptLetter.
- Click the gray report DataSource icon on the Detail section band to open the Report Data Source dialog.
- 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.
- Click the ellipsis (...) button to browse to the Northwind database. Click Open once you have selected the appropriate access path.
- Click OK to close the window and fill in the Connection String field.
- In the Query field, enter the following SQL query
SQL Query
Copy CodeSELECT 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 add controls and format the report
- Right-click the design surface of the report and select Insert, then Group Header/Footer to add group header and group footer sections.
- In the Properties Window, make the following changes to the group header section:
- DataField: CustomerID (This sets a new group for each customer.)
- Height: 2.5
- KeepTogether: True
- Make the following changes to the group footer section:
- Height: 1.1
- KeepTogether: True
- NewPage: After (This ensures that a new page begins after each customer's letter has finished rendering.)
- Make the following changes to the detail section:
- CanShrink: True
- Make the following changes to the page header section:
- Height: 0.8
- Add the following controls to the PageHeader section and set the properties as indicated.
Control Miscellaneous Size Location Label Font Size = 36
Style = Bold
Text = GrapeCity2.5, 0.65 in 0, 0 in Picture PictureAlignment = TopLeft
Image (click ellipsis, navigate to C:\Program Files\GrapeCity\ActiveReports 6\Introduction (or to C:\Program Files (x86)\GrapeCity\ActiveReports 6\Introduction on a 64-bit Windows operating system) and select itopimage1.gif)4.5, 0.65 in 2.5, 0 in - In the Report Explorer, expand the Fields node, then the Bound node. Drag the SubTotal field onto the group header section, add the following controls from the ActiveReports toolbox, and set the properties as indicated.
1, 0.2 in
Control DataField Size Text (Name) Miscellaneous Location Textbox SubTotal
1, 0.2 in txtSubtotal1
(Name)OutputFormat = Currency
Visible = False
SummaryType = SubTotal
SummaryGroup = GroupHeader15, 0 in RichText 6.5, 2.1 in AutoReplaceFields = True 0, 0 in Label 1, 0.198 in Order ID Bold 0.875, 2.25 in Label 1, 0.198 in Order Date Bold 1.875, 2.25 in Label 1, 0.198 in Amount Bold
Alignment = Right4.375, 2.25 in 
Note: Event though txtSubtotal1 is hidden, setting its properties is important as it provides the value and the formatting that is displayed in the RichText control. - In the Report Explorer, expand the Fields node, then the Bound node. Drag the following fields onto the detail section and set the properties of each textbox as indicated.
Field Size Miscellaneous Location OrderID 1, 0.2 in 0.875, 0 in OrderDate 1, 0.2 in OutputFormat = MM/dd/yy 1.875, 0 in Subtotal 1, 0.2 in OutputFormat = Currency
Alignment = Right4.375, 0 in - Add the following controls to the GroupFooter section and set the properties as indicated.
Control Size Text Miscellaneous Location Label 1.35, 0.198 in Best regards, Alignment = Right 5.15, 0.15 in Label 1.35, 0.198 in Accounts Receivable 5.15, 0.8 in - Add a label control to the PageFooter section and set the properties as indicated.
Alignment Size Text Location Center 6.5, 0.198 in GrapeCity, 401 Parkplace, Suite 411, Kirkland, WA 98033 0, 0 in
To add fields to the RichText control
- Double-click inside the RichText control box and delete the default text.
- Right-click inside the box and choose Insert Fields.
- In the Insert Field dialog that appears, enter Date and click the OK button.
- 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 image below for arrangement of fields):
- CompanyName
- ContactName
- Address
- City
- Region
- Country
- PostalCode
- ContactName
- Add the following text to the RichText control box after all of the fields:
Paste into the RichText control
Copy CodeDear [!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 look like the following.
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)
'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("Region", region);
//Use the value returned by the FetchData event
this.RichTextBox1.ReplaceField("Date", System.DateTime.Today.Date.ToString());
| |
To add code to send the group subtotal value to the RichText field
- 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.
To write the code in Visual Basic.NET
| 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)
| |
| 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);
| |
Hide All
