Skip to main content
All docs
V25.1
  • 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).

    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.

    WinForms AI-driven Semantic Search, DevExpress

    Run Demo

    Semantic search can operate in two modes:

    • Filter Mode - Displays only matching records.
    • Search Mode - Highlights relevant data rows for more intuitive data discovery.

    WinForms AI-driven Semantic Search Mode, DevExpress

    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.

    WinForms Mnemonic-Based Submenu Navigation, DevExpress

    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.

    WinForms Rounded Skin Panel, DevExpress

    // 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.

    WinForms RibbonForm Outlook-inspired Side Navigation, DevExpress

    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

      WinForms NavigationControlLayoutMode StretchToFormTitle, DevExpress

    • StretchToTop

      WinForms NavigationControlLayoutMode StretchToTop, DevExpress

    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).

    WinForms Expression Editor for Custom Format Conditions, DevExpress

    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.

    WinForms Conditional Formatting Filters, DevExpress

    Run Demo

    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):

    WinForms Data Editors Post Changes Immediately, DevExpress

    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.

    WinForms Interactive Step Progress Bar, DevExpress

    New StepProgressBar APIs include:

    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;
    }
    

    Run Demo

    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.

    WinForms MemoEdit - Auto Height within the Layout Control, DevExpress

    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.

    WinForms CheckedListBoxControl - Custom SVG Check Icon, DevExpress

    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.

    WinForms AI Chat Control File Attachments, DevExpress

    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.

    WinForms AI Chat Control Prompt Suggestions, DevExpress

    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.

    WinForms Accordion Control Badges and Hints, DevExpress

    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);
    }
    

    Run Demo

    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

    Run Demo

    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.

    WinForms BarToggleSwitchItem Toggle Switch Width, DevExpress

    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.

    WinForms BarToggleSwitchItem Thumb Width, DevExpress

    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:

    New APIs include:

    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.

    WinForms PDF Viewer AI-powered Behaviors, DevExpress

    Run Demo

    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:

    Our new APIs allow you to apply the following annotations:

    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.

    WinForms Rich Text Editor CJK Text Wrapping, DevExpress

    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:

    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);
    

    WinForms Rich Text Editor AcroForm Export, DevExpress

    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.

    Download: Free 30-day Trial

    Tip

    Your Feedback Matters! Take part in the survey on our website: WinForms Survey.

    See Also