Conversion Flow¶
How the RDLC to DevExpress conversion works.
Overview¶
The converter transforms RDLC reports into DevExpress REPX format automatically.
Simple view:
You don't need to understand the details - the system handles everything.
The 5 Stages¶
1. Parse (Read Your Report)¶
What happens: The RdlcParserService reads your RDLC file and extracts all controls, data sources, and parameters into an Intermediate Representation (IR).
Service: Application.Services.Parsing.RdlcParserService
You see:
2. Convert (DevExpress Tool)¶
What happens: The DevExpressToolConversionStrategy executes DevExpress.Reporting.Import.exe to convert basic structure and controls.
Service: Infrastructure.Conversion.Strategies.DevExpressToolConversionStrategy
Executor: Infrastructure.Execution.ResilientProcessExecutor (with retry logic)
You see:
Auto-converted:
- Textboxes → XRLabel
- Images → XRPictureBox
- Tables → XRTable
- Lines → XRLine
3. Patch (Fix Complex Items)¶
What happens: The DevExpressRepxPatcher coordinates three orchestrators to fix what DevExpress can't handle automatically, then automatically configures the report for multi-dataset access if needed.
Service: Application.Services.Patching.DevExpressRepxPatcher (main coordinator)
Three orchestrators:
A. Subreport Patching
- Orchestrator:
SubreportPatchingOrchestrator - Finds subreport references in IR
- Resolves files with
SubreportResolverService - Converts with
SubreportConversionOrchestrator - Injects XML with
XmlSubreportPatcher
B. Expression Fixing
- Orchestrator:
ExpressionFixingOrchestrator - Finds
#NOT_SUPPORTED#markers - Converts with
ExpressionConverterServiceandBasicRdlcExpressionConverter - Analyzes multi-dataset expressions with
MultiDatasetExpressionAnalyzer - Fixes multi-dataset field references that DevExpress import tool incorrectly converts
- Example:
Globals!PageNumber→[Arguments.PageInfo.PageNumber] - Example:
First(Fields!Name.Value, "DataSet1")+First(Fields!Name.Value, "DataSet2")→[DataSet1.Name]+[DataSet2.Name]
C. Nested Tablix Patching
- Orchestrator:
NestedTablixPatchingOrchestrator - Handles nested tables with
XmlNestedTablixPatcher - Extracts review info with
ManualReviewInfoExtractor - Analyzes complexity with
TableComplexityAnalyzer
D. DataMember Auto-Configuration
- Action: Automatically clears DataMember property if multi-dataset expressions detected
- Purpose: Enables ExpressionsAdvanced mode for
[DataSet.Field]syntax - Benefit: No manual configuration required
You see:
Fixing expressions...
Fixed 12 expressions
Processing subreports...
[OK] 2 subreports converted
Analyzing tables...
[OK] 1 complex table identified
Cleared DataMember property to enable ExpressionsAdvanced mode
4. Analyze (Check What Needs Review)¶
What happens: The analysis services identify items that may need your attention.
Services:
TableComplexityAnalyzer- Identifies complex table structuresManualReviewInfoExtractor- Extracts items needing manual review
You see:
5. Package (Create Output Files)¶
What happens: The RepxEmitterService saves the REPX and ManualConversionGuideGenerator creates your review guide.
Services:
RepxEmitterService- Saves REPX files and subreportsManualConversionGuideGenerator- Creates conversion guide with:- Detailed partial conversion reviews (controls that need verification)
- Manual table recreation instructions (nested tables)
- Type-specific checklists (Tablix, Table, Rectangle, Subreport, etc.)
- Step-by-step review instructions
You see:
Creating output files in Report-converted/...
[OK] Report.repx
[OK] Report-conversion-guide.md (includes partial conversion details)
[OK] Report-conversion-report.json
[OK] subreports/
Control Mappings¶
| RDLC | DevExpress |
|---|---|
| Textbox | XRLabel |
| Image | XRPictureBox |
| Table | XRTable |
| Line | XRLine |
| Rectangle | XRPanel |
| Subreport | XRSubreport |
| Chart | XRChart |
Expression Conversions¶
| RDLC | DevExpress |
|---|---|
Globals!PageNumber |
[Arguments.PageInfo.PageNumber] |
Fields!Name.Value |
[Name] |
Parameters!Date.Value |
?Date |
First(Fields!Total.Value, "DataSet") |
[Total] (single dataset) |
First(Fields!Name.Value, "DataSet1") + First(Fields!Name.Value, "DataSet2") |
[DataSet1.Name] + [DataSet2.Name] (multi-dataset) |
Timeline¶
| Report Type | Time |
|---|---|
| Simple | 10-20 sec |
| Medium | 30-60 sec |
| Complex | 1-3 min |
Output Files¶
All converted files are organized in a dedicated ReportName-converted/ folder to keep them separate from your original files.
Main Report (.repx)¶
Your converted report. Open in DevExpress Report Designer.
Conversion Guide (.md)¶
Step-by-step instructions for manual review items.
Conversion Report (.json)¶
Statistics and details (optional reference).
Subreports Folder¶
All converted subreports (if applicable).
Example structure:
your-project/
└── reports/
├── SalesReport.rdlc ← Original
└── SalesReport-converted/ ← All conversion output
├── SalesReport.repx
├── SalesReport-conversion-guide.md
├── SalesReport-conversion-report.json
└── subreports/
└── Details.repx
What's Preserved¶
Kept:
- Layout and positioning
- Data bindings
- Fonts and styles
- Report structure
Not Migrated:
- Actual data (you connect to your data source)
- Custom code functions (need manual rewrite)
Next Steps After Conversion¶
- Open
.repxin DevExpress Report Designer - Read conversion guide
- Connect to data source
- Test with sample data
- Complete manual adjustments
See Also¶
- MCP User Guide - Setup and configuration
- RDLC to DevExpress Conversion Guide - Convert individual RDLC files
- Mapping Rules - Detailed mappings
- Troubleshooting - Common issues
- DevExpress Migration Guide - Full project migration
Last Updated: December 18, 2025