v25.1 Release Notes
- 21 minutes to read
License Keys — New in v25.1
This new release requires every developer/build machine to store a DevExpress license key associated with your account.
DevExpress Unified Installer (Windows) automatically obtains your License Key and places it into its correct location. Run the installer in Repair/Register mode to update your key when necessary. If you used our Unified Installer before license keys were introduced (prior to v25.1), you should not experience any changes when installing or updating DevExpress products.
If you bypass the DevExpress Unified Installer, you can download your license key and register it in the system manually (via a file on disk or an environment variable). Review detailed instructions in the following help topic: Online NuGet Feeds, CI/CD, and Other Installation Methods (Windows, macOS, Linux).
AI-driven Semantic Search
Our WinForms Data Grid, GridLookUpEdit, and SearchLookUpEdit controls ship with an enhanced search experience and allow users to locate relevant data within large datasets faster/more accurately. Unlike standard keyword-based search, semantic search leverages Natural Language Processing (NLP) to analyze search queries beyond exact keyword matching.
Semantic search uses an embedding generator to convert text into numerical vector representations. Vector embeddings are stored in a vector store (for example, a database, in-memory collection, or a custom implementation that stores vector values in files). When a user enters a search query, the search engine computes similarity scores between the query vector and stored data vectors to return the most relevant results.
Once AI-driven semantic search is enabled, a dropdown button appears within the search box. The popup menu allows users to specify search mode:
- Standard - traditional keyword-based search.
- Semantic - vector-based semantic search to find conceptually similar items.
- Hybrid - a combination of standard and semantic search.
Semantic search can operate in two modes:
- Filter Mode - Displays only matching records.
- Search Mode - Highlights relevant data rows for more intuitive data discovery.
To enable semantic search within the WinForms Data Grid or Data Lookup control, you must register an embedding generator, supply a vector storage/database, connect our new SemanticSearchBehavior to the grid or lookup control, and configure behavior settings (such as, an embedding generator, vector store, record type in a vector store, data source key field, search mode, search accuracy, the maximum number of results, etc.).
Refer to the following help topic for more information: Semantic Search.
Accessibility
Mnemonic-Based Submenu Navigation
With v25.1, we enhanced keyboard accessibility for traditional Toolbar-based user interfaces. Users can cycle through submenu items with the same mnemonic (denoted by & in captions). When multiple items within a submenu have identical mnemonics, repeated key presses navigate through them sequentially. The feature is automatically enabled and does not require additional configuration.
barItemSaveAs.Caption = "Save &As";
barItemSaveAll.Caption = "Save &All";
Accordion Shortcuts
Accordion items now support keyboard shortcuts. Use the ShortcutKey property to specify a predefined or custom keyboard shortcut. This enhancement improves accessibility, especially for applications with complex navigation structures.
accordionControlElement1.ShortcutKey = new DevExpress.XtraBars.BarShortcut(Keys.J);
BarItem - Support for AutomationId
The AutomationId
property - a unique identifier that distinguishes UI elements in automated tests and accessibility (a11y) tools - is now available for BarItem objects. This property is automatically set to the bar item’s Name.
JSON Serialization
DevExpress WinForms UI controls now support JSON-based layout serialization - an alternative to XML for simplified integration with modern web and AI services. With v25.1, new SaveLayoutToJson(Stream)
and RestoreLayoutFromJson(Stream)
methods allow you to save and restore control layout in JSON format.
string filePath = "gridlayout.json";
void Form1_Load(object sender, EventArgs e) {
if (File.Exists(filePath)) {
using (var jsonStream = File.OpenRead(filePath))
gridView1.RestoreLayoutFromJson(jsonStream);
}
}
void Form1_FormClosing(object sender, FormClosingEventArgs e) {
using (var jsonStream = File.OpenWrite(filePath))
gridView1.SaveLayoutToJson(jsonStream);
}
Note
JSON serialization is available for projects targeting .NET 8+ and .NET Framework 4.6.2+.
Rounded Skin Panel
Now Available in the Visual Studio Toolbox
Our RoundedSkinPanel control is fully integrated into the Visual Studio designer and can be added to your form at design time directly from the Toolbox.
Unlike standard panels, our RoundedSkinPanel automatically renders rounded corners and padding around individual UI elements (GridControl, TreeList, RichEditControl, etc.) whenever the WXI skin is used. For other DevExpress Skins, RoundedSkinPanel falls back to a standard rectangular border without extra padding.
// Create a TreeList with no border.
TreeList treeList = new TreeList() { Dock = DockStyle.Fill };
// Create a RoundedSkinPanel and set it to fill the form.
roundedSkinPanel = new RoundedSkinPanel() { Dock = DockStyle.Fill };
// Add the TreeList to the panel.
roundedSkinPanel.Controls.Add(treeList);
// Add the panel to the form.
this.Controls.Add(roundedSkinPanel);
Important
The RoundedSkinPanel is designed to host a single UI control. If you attempt to add more than one, a warning will appear at design time. For complex layouts/UI requirements, simply nest multiple RoundedSkinPanel
controls.
Outlook-inspired Side Navigation
We added new properties to our WinForms RibbonForm to replicate the side navigation layout of Microsoft Outlook for Windows.
The NavigationControl property specifies the navigation control as a side navigation element (such as an AccordionControl, NavigationPane, or ToolboxControl). The NavigationControlLayoutMode property aligns the side navigation relative to the form’s title. Alignment options include:
StretchToFormTitle
StretchToTop
using DevExpress.XtraBars.Ribbon;
public partial class Form1 : RibbonForm {
public Form1() {
InitializeComponent();
this.NavigationControl = accordionControl1;
this.NavigationControlLayoutMode = RibbonFormNavigationControlLayoutMode.StretchToFormTitle;
}
}
Conditional Formatting
Expression Editor Support for Custom Format Conditions
With v25.1, users can create advanced conditional formatting rules via custom expressions (set the new FilterEditorAllowCustomExpressions property to activate the Expression Editor within our Conditional Formatting Rule Editor). When activated, users can define complex logic (such as [Created Date] > AddDays(LocalDateTimeToday(), -3)) as requirements dictate (as you would expect, this feature/capability offers increased flexibility when constructing formatting rules that rely on calculated values, functions, or advanced comparisons).
Available for the following DevExpress WinForms UI components:
New Filters
You can now filter data based on applied Conditional Formatting rules.
Users can apply these filters from:
- Excel-style Filter Menu
- Column Header Menu
- Filter Editor
Refer to the following help topic for more information: Conditional Formatting Filters.
Grids-based Components
Post Changes Immediately (when using DevExpress in-place Data Editors)
Our new InplaceModeImmediatePostChanges
option gives you greater control over how/when a DevExpress in-place editor posts values to an underlying data source.
When enabled, the following in-place editors immediately post updated values to the data source (without focus to shift):
You can also set the InplaceModeImmediatePostChanges
property to DefaultBoolean.Default
and use the WindowsFormsSettings.InplaceEditorUpdateMode property to control update behavior globally:
- Immediate - Post the edit value immediately after modification.
- Postponed - Post the edit value when the cell loses focus.
Refer to the following help topic for more information: BaseRepositoryItemCheckEdit.InplaceModeImmediatePostChanges.
Adjust Horizontal Scrolling on Touchpad
DevExpress WinForms grid-based controls (such as GridControl, TreeList, Gantt Control, and VGridControl) support smooth scrolling with a touchpad. However, some users may experience inverted horizontal scrolling behavior when using a touchpad on Windows devices.
v25.1 introduces a new InvertHorizontalScrolling global option that reverses current horizontal scrolling direction in our WinForms grid-based controls when using the touchpad or tilt wheel (the mouse with 4-way scrolling or trackball with side tilt support).
Enable the InvertHorizontalScrolling
property at application startup (in Program.cs) to invert the horizontal scrolling direction. Right swipe gestures and horizontal mouse wheel movements scroll content to the left.
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
WindowsFormsSettings.InvertHorizontalScrolling = DevExpress.Utils.DefaultBoolean.True;
Application.Run(new Form1());
}
ItemsView - Data Validation
v25.1 includes ValidateRow
and BeforeLeaveRow
events in the ItemsView.
Data Editors
Step Progress Bar - UX Enhancements
We improved the user experience for step-based navigation workflows. With v25.1, users can interact with StepProgressBar items as follows:
- Click an item to select it.
- Use arrow keys to move focus between items.
- Press Enter or Space to select an item.
New StepProgressBar APIs include:
- StepProgressBar.AllowUserInteraction - Specifies whether users can interact with items.
- StepProgressBarItem.AllowUserInteraction - Prevents user interaction with a specific item.
- StepProgressBar.ItemClick - Occurs when a user clicks an item in the StepProgressBar and allows you to cancel selection.
stepProgressBar1.AllowUserInteraction = true;
// ...
void StepProgressBar1_ItemClick(object sender, StepProgressBarItemClickEventArgs e) {
if (IsDataSaved(e.Item)) return;
if (XtraMessageBox.Show("You have unsaved changes. Would you like to save them?", "Warning", MessageBoxButtons.YesNo) == DialogResult.Yes)
e.Handled = true;
}
SearchLookUpEdit - Synchronized Find Panel Text
Our WinForms SearchLookUpEdit allows users to specify find panel text for the popup View, ensuring synchronization with the FindFilterText property. Previously, modifying the PopupView.FindFilterText
property did not update the find panel’s textbox, leading to inconsistencies in search behavior. This enhancement ensures that the find panel displays the actual filter applied.
searchLookUpEdit.Properties.View.FindFilterText = "Mike";
MemoEdit - Auto Height within the Layout Control
Our WinForms MemoEdit control includes a new LayoutControlAutoHeightMode property. This property specifies how MemoEdit height adjusts to fit content when placed within a LayoutControl. Available auto height modes include:
Default
/None
- MemoEdit height remains fixed and does not adjust to content. A scrollbar appears if content exceeds available height.GrowOnly
- MemoEdit height increases to fit content but does not decrease when content is reduced.GrowAndShrink
- MemoEdit height increases or decreases automatically to fit content.
CheckedListBoxControl - Custom SVG Check Icon
Our WinForms CheckedListBoxControl now supports user defined (custom) SVG check icons. With v25.1, you can specify unique icons for checked, unchecked, and grayed item states. This enhancement supports customizations designed to match application themes/UI standards.
checkedListBoxControl1.CheckStyle = CheckStyles.UserDefined;
checkedListBoxControl1.ImageOptions.SvgImageChecked = svgImageCollection["checkedState"];
checkedListBoxControl1.ImageOptions.SvgImageUnchecked = svgImageCollection["uncheckedState"];
checkedListBoxControl1.ImageOptions.SvgImageSize = new System.Drawing.Size(16, 16);
TokenEdit - Advanced Mode
v25.1 includes new APIs for our WinForms TokenEdit. With these APIs, you can customize the following advanced mode settings:
- Caret Animation (
AllowCaretAnimation
) - Selection Animation (
AllowSelectionAnimation
) - Selection Color Customization (
SelectionColor
)
Use the TokenEdit.Properties.AdvancedModeOptions property to access Advanced Mode settings:
// Enable Advanced Mode.
tokenEdit.Properties.UseAdvancedMode = DefaultBoolean.True;
// Enable caret animation.
tokenEdit.Properties.AdvancedModeOptions.AllowCaretAnimation = DefaultBoolean.True;
// Animate selection.
tokenEdit.Properties.AdvancedModeOptions.AllowSelectionAnimation = DefaultBoolean.True;
// Set selection color.
tokenEdit.Properties.AdvancedModeOptions.SelectionColor = Color.Yellow;
We also implemented a new QueryAdvancedMode static event. This event fires for every TokenEdit control in the project and allows you to configure Advanced Mode settings based on your preferences.
using DevExpress.Utils;
using DevExpress.XtraEditors;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DXApplication {
internal static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
TokenEdit.QueryAdvancedMode += TokenEdit1_QueryAdvancedMode;
Application.Run(new Form1());
}
static void TokenEdit1_QueryAdvancedMode(object sender, TokenEdit.QueryAdvancedModeEventArgs e) {
if(e.ParentForm is Form1) {
// Enable Advanced Mode.
e.UseAdvancedMode = DefaultBoolean.True;
// Set the selection color
e.Editor.Properties.AdvancedModeOptions.SelectionColor = Color.Yellow;
}
}
}
}
AI Chat Control
File Attachments
Users can now attach files directly to their chat messages. This enables the AI to analyze document content (such as text files, PDFs, images) and deliver more context-aware responses.
Enable the FileUploadEnabled
property to allow users to attach files, and configure related settings based on your project requirements (the maximum file size, allowed file types/extensions, the maximum number of files that users can attach to a message):
aiChatControl1.FileUploadEnabled = DevExpress.Utils.DefaultBoolean.True;
aiChatControl1.OptionsFileUpload.FileTypeFilter.AddRange(new List<string> { "text/plain", "application/pdf", "image/png" }); // Allowed MIME types.
aiChatControl1.OptionsFileUpload.AllowedFileExtensions.AddRange(new List<string> { ".txt", ".pdf", ".png" });
aiChatControl1.OptionsFileUpload.MaxFileCount = 5;
aiChatControl1.OptionsFileUpload.MaxFileSize = 5 * 1024 * 1024; // 5 MB
Refer to the following help topic for additional information: File Attachments.
Prompt Suggestions
To help users get started or explore new possibilities, the DevExpress AI Chat Control can display prompt suggestions.
Use the SetPromptSuggestions
method to supply intelligent suggestions:
using DevExpress.AIIntegration.Blazor.Chat.WebView;
aiChatControl1.SetPromptSuggestions(new List<PromptSuggestion>(){
new PromptSuggestion(
title: "Birthday Wish",
text: "A warm and cheerful birthday greeting message.",
prompt: "Write a heartfelt birthday message for a close friend."),
new PromptSuggestion(
"Thank You Note",
"A polite thank you note to express gratitude.",
"Compose a short thank you note to a colleague who helped with a project.")
});
Refer to the following help topic for additional information: Prompt Suggestions.
Stop Response
Users can now interrupt lengthy AI responses with a single click.
Accordion
Badges and Hints
We integrated our WinForms Accordion Control with the Adorner UI Manager to help display badges/hints and highlight specific Accordion UI elements.
Refer to the following help topic for more information: Adorner UI Manager.
using System.Drawing;
using DevExpress.Utils.VisualEffects;
// ...
Badge badgeInbox;
public Form1() {
InitializeComponent();
badgeInbox = new Badge();
// Assign the badge to the 'Inbox' accordion item.
badgeInbox.TargetElement = accordionItemInbox;
// Specify badge text.
badgeInbox.Properties.Text = "17";
// Specify badge location and offset.
badgeInbox.Properties.Location = ContentAlignment.TopLeft;
badgeInbox.Properties.Offset = new Point(85, 6);
// Customize badge appearance.
badgeInbox.Appearance.BackColor = Color.Gray;
badgeInbox.Appearance.BorderColor = Color.Gray;
badgeInbox.Appearance.ForeColor = Color.White;
badgeInbox.Appearance.Font = new Font("Tahoma", 8.25F, FontStyle.Bold);
// Add the badge to the AdornerUIManager.
adornerUIManager1.Elements.Add(badgeInbox);
}
Map Control
Azure Maps - New Demos
The following demos have been updated to use new Azure Maps Data Providers. We encourage you to examine our implementation to streamline your transition to Azure Maps:
- Map Elements
- Gpx Data Adapter
- Sales Dashboard
- Clustering
- Map Editor
- Photo Gallery
- Items Moving
- Vector Item Data Source
- Bubble Charts
- Coordinate Systems
- Geo Shape Image
Ribbon and Bars
BarToggleSwitchItem - Toggle Switch Width
With v25.1, you can specify a toggle switch bar item width. Use the EditorToThumbWidthRatio property to set the item’s total width relative to the width of the thumb.
Skins such as Visual Studio 2010, Office 2013, and others with similar visual styles render thumbs as rectangles. To support these skins, we added the ThumbWidth property. In these skins, the overall width of the toggle switch editor is calculated as the product of ThumbWidth
and EditorToThumbWidthRatio
property values.
Handle Bar Item Right-Clicks
The WinForms Bar Manager and Ribbon Control now support right-click handling for bar items. New events include:
We also introduced a new e.MouseButton event parameter that allows you to identify the pressed mouse button.
Ribbon - Disable Double-Click Minimization
You can now minimize the DevExpress WinForms Ribbon via a double click. This behavior is controlled by the AllowMinimizeRibbonOnDoubleClick property. Set this property to false
to disable double-click minimization.
Maximize/Minimize Ribbon
New APIs include:
- MaximizeRibbon(RibbonPage) - Expands a minimized Ribbon.
- RibbonControl.AllowMinimizeRibbonOnDoubleClick - Specifies whether users can minimize the Ribbon by double-clicking a page header.
Identify Bar Items and Bar Links
New APIs include:
- BarManager.GetItemAt(Point) - Identifies the bar item at specified screen coordinates.
- BarManager.GetLinkAt(Point) - Identifies the BarItemLink at specified screen coordinates.
barManager.ItemClick += (sender, e) => {
BarItem item = barManager.GetItemAt(Cursor.Position);
BarItemLink itemLink = barManager.GetLinkAt(Cursor.Position);
Debug.WriteLine(item.Caption);
Debug.WriteLine(itemLink.Caption);
};
PDF Viewer
AI-powered Behaviors
You can now utilize AI-powered Summarize, Translate, and Ask AI features within the DevExpress WinForms PDF Viewer. You can access desired AI operations using the PDF Viewer’s context menu.
WinForms PDF Viewer AI-powered behaviors have the same prerequisites and leverage the same integration mechanisms as other AI extensions in our WinForms product line.
Refer to the following help topic for additional information: DevExpress AI-powered Extensions for WinForms.
Preserve Compressed Object Streams when Saving
Our new compression engine preserves the original (compressed) state of PDF object streams.
PDF Redaction API
v25.1 includes new APIs to create and manage PDF redaction annotations. This new capability allows you to hide or remove sensitive or private content from your documents and add a colored text overlay across the redacted area.
The redaction process includes two steps:
- Create a redaction annotation with the required appearance in the PDF page area (useful if you wish to hide content but retain it for other users).
- Clear content with the annotation and apply the overlay with specified appearance settings. In this instance, all hidden content will be removed.
Note
Redaction support is available through the PDF Facade API (DevExpress.Pdf.PdfDocumentFacade class). This class is defined in the DevExpress.Docs.v25.1.dll
assembly. Add this assembly to your project or install the DevExpress.Document.Processor NuGet Package from the Offline Package source to use PdfDocumentFacade
members.
You need an active license for the DevExpress Office File API Subscription or DevExpress Universal Subscription to use this class in production code.
Create and Apply Redaction Annotations in Code
To create a redaction annotation, follow the steps below:
- Use the PdfViewerControl.GetDocumentFacade extension method to obtain a DevExpress.Pdf.PdfDocumentFacade instance. Retrieve the required PDF page from the PdfDocumentFacade.Pages collection.
- Call the PdfPageFacade.AddRedactAnnotation method. This method returns the PdfRedactAnnotationFacade object and allows you to modify the following appearance settings for the redaction annotation: background color, overlay text, text font settings (font name, color, size, and style), text repetition and alignment.
Our new APIs allow you to apply the following annotations:
- Single redaction annotation: PdfRedactAnnotationFacade.Apply
- All redaction annotations for a specific page: PdfPageFacade.ApplyRedactAnnotations
- All redaction annotations across the entire document: PdfDocumentFacade.ApplyRedactAnnotations
You can also use DevExpress.Pdf.PdfClearContentOptions to specify the type of content to remove (text, graphics, images, or annotations) when you apply the redaction.
pdfViewer.LoadDocument("Demo.pdf");
//...
PdfDocumentFacade documentFacade = pdfViewer.GetDocumentFacade();
PdfRectangle pageCropBox = pdfViewer.GetPageInfo(0).CropBox;
PdfRectangle redactBounds =
new PdfRectangle(0, pageCropBox.Height-50, 200, pageCropBox.Height);
// Add a redaction annotation at the top left corner of the first document page.
PdfRedactAnnotationFacade redactAnnotation =
documentFacade.Pages[0].AddRedactAnnotation(redactBounds);
redactAnnotation.Author = "Jane Doe";
// Setup redaction annotation appearance
redactAnnotation.FillColor = new PdfRGBColor(0, 0, 0);
redactAnnotation.FontColor = new PdfRGBColor(1, 1, 1);
redactAnnotation.FontName = "Calibri";
redactAnnotation.FontSize = 0; // enables font auto-size
redactAnnotation.OverlayText = "Classified";
redactAnnotation.TextJustification = PdfTextJustification.Centered;
redactAnnotation.RepeatText = false;
// Apply the redaction annotation.
redactAnnotation.Apply();
The following sample selects an area in a PDF document (when using our PDF Viewer) and applies the redaction annotation to this area: PDF Viewer for WinForms - Add Redaction Annotations Using Viewer Coordinates.
Spreadsheet Control
OLE Objects
The DevExpress WinForms Spreadsheet Control now supports OLE objects. OLE (Object Linking and Embedding) allows you to link external files and embed data (spreadsheets, PDFs, mail messages, presentations, etc.) into your Excel documents.
With OLE Object support, you can execute the following operations:
- Create OLE objects that store links to external files or embed data from these files in your document;
- Obtain OLE object properties;
- Extract OLE object data from a document;
- Remove OLE objects from a document;
- Print and export documents with OLE object icons to PDF and image formats;
- Load and save documents that contain OLE objects without content loss.
An OLE object is represented by the OleObject
interface. As a unique document shape, the OLE object inherits all the settings from the base Shape
interface. Shape settings define OLE object icon appearance, location, and internal object properties (including name, icon size, icon position in a worksheet, alt text, etc).
To access OLE objects in a worksheet, use the Worksheet.OleObjects collection. They are also available through the base Worksheet.Shapes collection. OleObjectCollection.AddLinkedOleObject and OleObjectCollection.AddEmbeddedOleObject methods allow you to create a new linked or embedded OLE objects in a worksheet.
Worksheet worksheet = spreadsheetControl.ActiveWorksheet;
CellRange oleIconRange = worksheet.Range["B4:D6"];
SpreadsheetImageSource oleIcon = SpreadsheetImageSource.FromFile("oleIcon.png");
// Create linked OLE object.
OleObject oleObjectLinked = worksheet.OleObjects.AddLinkedOleObject(
oleIconRange, "package.pdf", OleObjectType.Package, oleIcon);
// Create embedded OLE object from byte array.
byte[] sourceData = File.ReadAllBytes("package.pdf");
OleObject oleObjectEmbedded1 = worksheet.OleObjects.AddEmbeddedOleObject(
oleIconRange, sourceData, OleObjectType.Package, oleIcon);
// Create embedded OLE object from file stream.
using (var stream = File.OpenRead("package.pdf")) {
OleObject oleObjectEmbedded2 = worksheet.OleObjects.AddEmbeddedOleObject(
oleIconRange, stream, OleObjectType.Package, oleIcon);
}
You can also extract and analyze linked and embedded data. Use the OleObject.InsertType property to determine OLE object type (linked or embedded). OleObject.AsLinkedContent and OleObject.AsEmbeddedContent methods allow you to extract additional information based on OLE object type. For linked objects, you can obtain the linked file name using the OleObjectLinkedContent.FileName property. For embedded objects, you can get raw binary content using the OleObjectEmbeddedContent.GetRawData method or save embedded content to a file using the OleObjectEmbeddedContent.SaveAs method.
Worksheet worksheet = spreadsheetControl.ActiveWorksheet
OleObject oleObject = worksheet.OleObjects[0];
if(oleObject.InsertType == OleObjectInsertType.Linked)
{
OleObjectLinkedContent linkedContent = oleObject.AsLinkedContent();
string linkedFileName = linkedContent.FileName;
}
if(oleObject.InsertType == OleObjectInsertType.Embedded)
{
OleObjectEmbeddedContent embeddedContent = oleObject.AsEmbeddedContent();
byte[] oleRawData = embeddedContent.GetRawData();
if (oleObject.Type == OleObjectType.AdobeAcrobatDocument)
using (FileStream stream = new FileStream("embedded_document.pdf", FileMode.Create, FileAccess.Write))
embeddedContent.SaveAs(stream);
}
You can also remove OLE objects from your spreadsheets. Use the OleObject.Delete, OleObjectCollection.Remove or OleObjectCollection.RemoveAt method to remove individual OLE objects, or use the OleObjectCollection.Clear method to remove all OLE objects from a worksheet.
OleObject oleObject = worksheet.OleObjects[0];
// Remove the current OLE object.
oleObject.Delete();
// or
worksheet.OleObjects.Remove(oleObject);
// Remove all OLE objects in the collection.
worksheet.OleObjects.Clear();
Note
OLE object support is only available in OpenXML-based file formats (XLSX, XLSM, XLTX, and XLTM).
Rich Text Editor
Right-to-Left (RTL) Engine Enhancements
We enhanced our Right-to-Left text rendering engine (improved text order in paragraphs, headers and footers, numbering lists, tables and shapes with bi-directional text including mixed Right-to-Left and Left-to-Right text blocks).
Available when you generate a PDF file, image, or print output via the User Interface or code.
CJK (Chinese, Japanese and Korean) Text Wrapping
v25.1 adds CJK text wrapping and line-breaking rule support. In previous versions, our Rich Text Editor applied Latin text wrapping rules (which rely on space characters and punctuation marks) to Chinese, Japanese, and Korean text.
New wrapping rules correctly apply line breaks between individual characters across document paragraphs, headers and footers, tables, and shapes. Documents that use CJK text wrapping rules can now be printed/exported to PDF and image formats with appropriate text layouts.
PDF Export - Convert Word Content Controls to PDF AcroForm Fields
We extended the Word Document to PDF export engine with built-in conversion of Word content controls to PDF AcroForm fields.
DevExpress Word-processing tools automatically convert the following content control types:
- Plain Text
- Rich Text
- Picture
- Check Box
- Combo Box
- Drop-Down List
- Date Picker
Note
Building Block and Repeating Section controls are exported as regular text.
Due to PDF format limitations, PDF text fields generated from Rich Text content controls use formatting from the first word of the original Rich Text content control.
Rich Text content controls that split pages or contain complex objects (like tables) are exported as regular text.
To enable this capability, you must:
- Load your Word file with content controls or generate content controls in your document using the DevExpress WinForms Rich Text Editor.
- Create a PdfExportOptions instance. Enable the PdfExportOptions.ExportEditingFieldsToAcroForms property.
- Call the ExportToPdf method with this
PdfExportOptions
object as a parameter.
You can also activate this capability from the User Interface using the Print Preview -> PDF Export Options dialog.
using DevExpress.XtraPrinting;
using DevExpress.XtraRichEdit;
richEditControl.LoadDocument("input_content_controls.docx");
PdfExportOptions options = new PdfExportOptions();
options.ExportEditingFieldsToAcroForms = true;
richEditControl.ExportToPdf("output_with_acroform.pdf", options);
Compare Word Documents
You can now programmatically compare two Word documents. Our new CompareDocumentExtensions.Compare
extension method allows you to execute the following operations:
- Identify changes between two document versions and generate Word output with revisions.
- Compare both document text and formatting (including case-sensitivity).
- Compare content in document headers, footers and textboxes.
- Setup the author/date of output revisions.
- Compare content at the word or character level.
- Return the document with revisions as a new Document instance for further processing (or automatically replace an input documents with the revised content).
Note
Input documents must not include document revisions. Otherwise, the Compare
method throws an exception.
richEditControl.LoadDocument("FirstLook_original.docx");
Document originalDocument = richEditControl.Document;
RichEditDocumentServer wordProcessor = new RichEditDocumentServer();
wordProcessor.LoadDocument("FirstLook_revised.docx");
Document revisedDocument = wordProcessor.Document;
// Setup compare options, compare two documents,
// and add revisions to the RichEditControl document.
Document docWithRevisions = originalDocument.Compare(revisedDocument,
new CompareDocumentOptions()
{
Author = "Jane Doe",
DateTime = DateTime.Now,
ComparisonLevel = ComparisonLevel.Word,
CompareCaseChanges = false,
CompareFormatting = true,
CompareHeadersAndFooters = true,
CompareTextBoxes = true
}, ComparisonTargetType.Original);
Note
The CompareDocumentExtensions.Compare
extension method is defined in the DevExpress.Docs.v25.1.dll assembly. Add this assembly to your project or install the DevExpress.Document.Processor NuGet Package from the offline Package source to use our CompareDocumentExtensions.Compare
method.
Important
You need an active DevExpress Office File API Subscription or DevExpress Universal Subscription to use this class in production code.
XtraMessageBox
Display in the Windows Taskbar and Custom Start Position
With new functionality you can:
- Display the DevExpress Message Box in the Windows Taskbar, ensuring it is easily accessible to users.
- Define the start position of the Message Box on screen.
void messageButton_Click(object sender, EventArgs e) {
XtraMessageBoxArgs args = new XtraMessageBoxArgs() {
Caption = "Tip",
Text = "Hello DevExpress!",
Buttons = new DialogResult[] { DialogResult.OK },
};
args.ImageOptions.SvgImage = svgImageCollection1["info"];
args.ImageOptions.SvgImageSize = new Size(32, 32);
args.Showing += Args_Showing;
XtraMessageBox.Show(args);
}
void Args_Showing(object sender, XtraMessageShowingArgs e) {
// Get the screen working area.
Rectangle workingArea = Screen.PrimaryScreen.WorkingArea;
// Calculate bottom-right position.
int x = workingArea.Right - e.MessageBoxForm.Width;
int y = workingArea.Bottom - e.MessageBoxForm.Height;
// Define message box start position.
e.MessageBoxForm.StartPosition = FormStartPosition.Manual;
e.MessageBoxForm.Location = new Point(x, y);
// Display the message box in the Windows taskbar.
e.MessageBoxForm.ShowInTaskbar = true;
}
Download 30-Day Trial
With numerous new products and dozens of high-impact features, DevExpress UI components allow you to build your best, without limits or compromise. Download our fully-functional 30-day trial today and experience the DevExpress difference today.
Tip
Your Feedback Matters! Take part in the survey on our website: WinForms Survey.