Merge Blocks in X16: Filtering, Sorting and Conditional Rendering
TX Text Control X16 introduces programmatic merge block insertion through the DataSourceManager API, supporting inline filtering, sorting, and conditional rendering. Block merging conditions evaluate parent table values to control block visibility without custom event code.

Typically, a merge block is used to repeat content based on data rows of a specific table or child table. Merge blocks can be also used to group elements for various reasons. One reason could be the conditional rendering of merge blocks.
This article describes how to add a merge block programmatically using the TXText
In this article, the following simple data structure is used as the data source:
public class Report
{
public string Name { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public string Name { get; set; }
public float Price { get; set; }
}
On loading, a new data object is created and loaded into the TXText
DataSourceManager dsManager;
Report report;
private void LoadData()
{
List<Report> reports = new List<Report>();
report = new Report()
{
Name = "Test Report",
Products = new List<Product>() {
new Product() { Name = "TX Text Control Product 1", Price = 634.34F },
new Product() { Name = "TX Text Control Product 2", Price = 34.34F },
}
};
reports.Add(report);
// create a new DataSourceManager and load the data object
dsManager = new DataSourceManager();
dsManager.LoadSingleObject(report);
// display the possible merge block tables in a combo box
cbMergeBlocks.Text = "";
cbMergeBlocks.DataSource =
dsManager.PossibleMergeBlockTables.ToList<DataTableInfo>();
cbMergeBlocks.DisplayMember = "TableName";
}

To insert a new merge block programmatically, the TXText
// set the DataSourceManager master table
// in order to retrieve the available column names
dsManager.MasterDataTableInfo = dsManager.DataTables[cbMergeBlocks.Text];
// create a new MergeBlockInfo to specify instructions
MergeBlockInfo mergeBlockInfo = new MergeBlockInfo(cbMergeBlocks.Text);
// the SortingInstructions specify how the block should be sorte
// Sorting: Ascending by Price
mergeBlockInfo.SortingInstructions =
new List<TXTextControl.DocumentServer.DataShaping.SortingInstruction>()
{
new TXTextControl.DocumentServer.DataShaping.SortingInstruction(
"Price",
TXTextControl.DocumentServer.DataShaping.SortOrder.Ascending)
};
// the Filters define which rows are displayed
// Filter: Price > 500
mergeBlockInfo.Filters =
new List<TXTextControl.DocumentServer.DataShaping.FilterInstruction>()
{
new TXTextControl.DocumentServer.DataShaping.FilterInstruction(
"Price",
TXTextControl.DocumentServer.DataShaping.RelationalOperator.GreaterThan,
500
)
};
// the BlockMergingCondition can be used to conditionally render a block
// based on a condition in the parent table
// Condition: If Name property is Test Report
mergeBlockInfo.BlockMergingCondition =
new List<TXTextControl.DocumentServer.DataShaping.FilterInstruction>()
{
new TXTextControl.DocumentServer.DataShaping.FilterInstruction(
"Name",
TXTextControl.DocumentServer.DataShaping.RelationalOperator.Equals,
"Test Report"
)
};
// specify the column names
mergeBlockInfo.ColumnNames = dsManager.PossibleMergeFieldColumns.Select(
column => column.ColumnName).ToList();
// define the block itself
MergeBlockSettings blockSettings = new MergeBlockSettings(BlockTemplateType.TableRow, true);
// insert the block
dsManager.InsertMergeBlock(textControl1, mergeBlockInfo, blockSettings);

There are three conditions in the merge block defined:
- Sorting: The table is sorted ascending by the column Price.
- Filtering: Only rows are rendered where the column Price is greater than 500.
- Conditions: The whole block is only rendered, if the column Name of the parent table is Test Report.
The document is then merged using the TXText
MailMerge mailMerge = new MailMerge()
{
TextComponent = textControl1
};
mailMerge.MergeObject(report);

These new merge block settings can be used to handle data shaping in the template directly and to render parts of a document conditionally based on merge field values in the data source. No custom event handling is required anymore to set the conditions for a merge block.
Test this on your own and download a trial version of TX Text Control X16.
Also See
This post references the following in the documentation:
- TXText
Control. Document Server. Data Sources. Data Source Manager Class - TXText
Control. Document Server. Data Sources. Data Source Manager. Insert Merge Block Method - TXText
Control. Document Server. Mail Merge Class - TXText
Control. Document Server. Mail Merge. Merge Object Method
Reporting
The Text Control Reporting Framework combines powerful reporting features with an easy-to-use, MS Word compatible word processor. Users can create documents and templates using ordinary Microsoft Word skills. The Reporting Framework is included in all .NET based TX Text Control products including ASP.NET, Windows Forms and WPF.
Related Posts
ReportingWindows FormsMail Merge
MailMerge: Conditional Rendering of Merge Blocks
TX Text Control X16 provides two approaches to conditionally render merge blocks within MailMerge templates. Setting RemoveEmptyBlocks removes blocks when child data is absent, while…
ReportingWindows FormsMail Merge
DataSourceManager: Using the Ready-to-Use Reporting Dialog Boxes
The TX Text Control DocumentServer namespace ships with seven ready-to-use reporting dialogs for data selection tasks: chart data relations, filter and sort, database connection, data source…
MailMerge Improvements in X14: Event Arguments and JSON Data Sources
TX Text Control X14 MailMerge introduces the MergeJsonData method for merging JSON strings directly into reporting templates. New event arguments expose DataRowAdapter, DataTableAdapter, and…
Preview: JSON Support in MailMerge Version X14 (24.0)
MailMerge X14 (24.0) adds a Merge method overload that accepts JSON strings as a data source alongside DataTable and DataSet inputs. JSON data supports nested objects for relational structures and…
TX Text Control 32.0 Has Been Released
We are pleased to announce the immediate availability of TX Text Control 32.0 for all platforms including ASP.NET, Windows Forms, WPF and ActiveX.
