Skip to content

Mapping Rules Guide

How RDLC controls and expressions are converted to DevExpress.


Control Mappings

Complete Table

RDLC Control DevExpress Control Status Notes
Textbox XRLabel Full Simple text
Textbox (HTML) XRRichText Full When MarkupType="HTML"
Image XRPictureBox Full All sources
Line XRLine Full Horizontal/vertical
Rectangle XRPanel Full Container
Table XRTable Partial Simple→full, complex→review
Tablix XRTable Partial Groupings may need config
List XRPanel Partial Data binding may need adjust
Subreport XRSubreport Full Custom patching
Chart XRChart Partial Series may need config

Status:

  • Full = Ready to use
  • Partial = Works but may need tweaking

Expression Mappings

Global Variables

RDLC DevExpress
Globals!PageNumber [Arguments.PageInfo.PageNumber]
Globals!TotalPages [Arguments.PageInfo.PageCount]
Globals!ExecutionTime [Arguments.PageInfo.ExecutionTime]
Globals!ReportName [Arguments.ReportName]

Field References

RDLC DevExpress Notes
Fields!Name.Value [Name] Simple field
First(Fields!Name.Value, "DataSet") [Name] Single dataset
First(Fields!Name.Value, "DataSet1") + First(Fields!Name.Value, "DataSet2") [DataSet1.Name] + [DataSet2.Name] Multi-dataset
Sum(Fields!Amount.Value, "DataSet") Sum([Amount]) Aggregation
Count(Fields!ID.Value, "DataSet") Count([ID]) Aggregation

Parameters

RDLC DevExpress
Parameters!StartDate.Value ?StartDate

Operators

RDLC DevExpress Notes
not Not Logical NOT
or Or Logical OR
and And Logical AND
.Equals(x) == x Equality check
<> != Not equal
& & String concatenation

Examples

Example 1: Simple Expression

RDLC:

="Page " & Globals!PageNumber & " of " & Globals!TotalPages

DevExpress:

="Page " & [Arguments.PageInfo.PageNumber] & " of " & [Arguments.PageInfo.PageCount]

Example 2: Field Reference

RDLC:

=First(Fields!CustomerName.Value, "Customers")

DevExpress:

=[CustomerName]

Example 3: Conditional

RDLC:

=IIF(Fields!Amount.Value > 100, "High", "Low")

DevExpress:

=Iif([Amount] > 100, 'High', 'Low')

Example 4: Multi-Dataset Expression

RDLC:

=First(Fields!Process.Value, "DataSetText") & " " & First(Fields!Status.Value, "DataSetData")

DevExpress:

=[DataSetText.Process] & " " & [DataSetData.Status]

Automatically handled: The converter automatically clears the DataMember property when multi-dataset expressions are detected, enabling ExpressionsAdvanced mode required for [DataSet.Field] syntax.


Partial Conversions

What "Partial" Means

The control converts successfully but may need manual adjustment.

Common Partial Conversions

Complex Tables

  • Nested tables
  • Multiple grouping levels
  • Dynamic columns

What to do: Open in DevExpress Designer → Adjust groupings and layout

Charts

  • Multiple series
  • Custom colors

What to do: Configure series and appearance in DevExpress Designer


Not Auto-Converted

⚠️ Important: These patterns are only blocked if the DevExpress Import Tool marks them as #NOT_SUPPORTED# first. If DevExpress converts them directly (without marking), they will pass through our converter unchanged and may not work correctly in the final report.

Our converter processes expressions in two stages:

  1. DevExpress Import Tool converts the RDLC → REPX and marks problematic expressions as #NOT_SUPPORTED#
  2. Our Post-Processor scans for #NOT_SUPPORTED# markers and attempts conversion or inserts manual review placeholders

Custom Code Functions

RDLC:

=Code.CalculateDiscount(Fields!Amount.Value)

What happens:

  • ✅ If DevExpress marks as #NOT_SUPPORTED#: Replaced with placeholder [Manual Edit Required: Custom Code Function]
  • ⚠️ If DevExpress converts directly: Passes through (likely broken)

Solution: Rewrite in DevExpress Scripts tab

ReportItems References

RDLC:

=ReportItems!TextBox1.Value

What happens:

  • ✅ If DevExpress marks as #NOT_SUPPORTED#: Replaced with placeholder [Manual Edit Required: ReportItems Reference]
  • ⚠️ If DevExpress converts directly: Passes through (likely broken)

Solution: Use calculated field or direct field reference

Lookup Functions

RDLC:

=Lookup(Fields!ID.Value, Fields!ID.Value, Fields!Name.Value, "Dataset")

What happens:

  • ✅ If DevExpress marks as #NOT_SUPPORTED#: Replaced with placeholder [Manual Edit Required: Lookup Function]
  • ⚠️ If DevExpress converts directly: Passes through (likely broken)

Solution: Verify in DevExpress, may need query restructure or use calculated fields


Rule Structure

Rules are in data/rules/mapping-rules.json:

{
  "id": "textbox-to-xrlabel",
  "match": {
    "type": "Textbox"
  },
  "mapTo": "XRLabel",
  "notes": "Textbox converted to XRLabel"
}

Viewing Rules in Cursor

Ask Cursor:

"What are the RDLC to DevExpress mapping rules?"


See Also


Last Updated: December 18, 2025