Version History

.NET WinForms HTML Editor Control release history.

Version 9.2.0

Released Jul 3, 2026 - Version 9.2.0 fixes critical data-loss, crash, hang, paste/HTML corruption, spell-check, table editing, licensing, localization, clipboard, and WPF/WinForms API issues.

Bug fixes

  • Design-time "(Trial Version)" banner shown on the Visual Studio designer surface for licensed customers
  • MS Word paste corrupted markup: final cleanup destroyed non-empty style/class attributes and corrupted tag names
  • Table Cell Properties crashed on a fractional percentage width/height (unguarded int.Parse)
  • Table Properties crashed on tables whose cell rowspan exceeded the actual row count
  • Mail-merge / paste insertion could silently replace the entire document body when pasteHTML failed
  • Cut/Delete could silently delete unselected content (e.g. an adjacent image) next to the selection
  • Polish (and other code-page) spell-check dictionaries failed to load on .NET 5+ (encoding provider unregistered)
  • Table structural edits could corrupt a different or since-modified table via a stale cached TableMap
  • Decimal CSS font sizes were misread on non-English locales (float.Parse without InvariantCulture)
  • Design/HTML round-trip corrupted documents: empty non-void elements were emitted without a closing tag
  • Formatter dropped whitespace-only text nodes, merging adjacent inline words together
  • Licensing could crash or mis-license on non-Gregorian-calendar locales (culture-sensitive DateTime.Parse of the release date)
  • MS Word paste merged all lists into one and turned numbered lists into bullets
  • MS Word paste stripped IE conditional comments (regressed the ALM #492 fix)
  • Pasting an image from MS Word deleted it (VML stripped before image conversion ran)
  • Opening a legacy ANSI/windows-1252 HTML file corrupted its text on .NET 5+ (Encoding.Default is UTF-8)
  • Zero-border table guideline pass could permanently freeze the UI thread (lock + AutoResetEvent + BackgroundWorker deadlock)
  • Reading BodyHtml before the document existed entered an unbounded message-pump loop (hang)
  • Saving to a file deleted the existing file before the new content was written (data loss on failure)
  • Hyperlink dialog: after removing one link, later OK silently unlinked instead of inserting (stale cached-dialog state)
  • Style Builder re-applied stale CSS or silently wiped styles (property dictionary never cleared between opens)
  • Style Builder silently deleted CSS values its combo boxes could not represent (display:flex, position:fixed, width:auto, etc.)
  • Document cleanup deleted the entire content of <font> tags that had no recognized attribute
  • Style Builder border color pickers corrupted the red channel of every picked color (20-bit ARGB mask)
  • Table Properties crashed (ArgumentOutOfRangeException) on tables with more than 50 rows or columns
  • DialogService.Dispose() was empty, leaking every cached dialog per editor instance (static LanguageChanged root)
  • Reading DocumentHtml corrupted non-ASCII text (adapter bypassed the charset-compensating getter)
  • A mode-switch failure could silently wipe the entire document (release-only catch cleared the source before conversion)
  • EditorMode setter swallowed all exceptions in release, leaving the mode flag and content views inconsistent
  • Email image-embedding crashed on an img without src, a short/empty src, or a malformed base64 data URI
  • Selection-sync markers could be left permanently inside the user's document on a failed mode switch
  • Cleanup TD-wrapping regex corrupted nested tables by matching a span across tag boundaries
  • Table row/column span arithmetic errors (inserted extra cells, mis-sized grid crash, wrong column position, null-cell insert)
  • Inline spell-check node cache was mutated concurrently from the background scan and UI threads with no synchronization
  • Interactive spell-check pre-scan ran a full synchronous O(N^2) document scan on the UI thread on tables
  • A relative Hunspell affix (.aff) path was not rooted against the app base directory, breaking after a CWD change
  • German/Norwegian/Polish embedded NetSpell dictionaries broke on .NET Framework: .aff/.dic parsed as hardcoded UTF-8, ignoring the SET directive
  • .NET Framework NetSpell user dictionary ignored the configured file path (read/saved under %APPDATA%\NetSpell instead)
  • Inline spell-check debounce timer could crash the process by BeginInvoke on a just-disposed control
  • .NET Framework spell-check suggestion generation raced the background scan (Suggest iterated a list the worker thread cleared)
  • Mail-merge InsertPlaceholder silently dropped the insert before the document was ready yet still fired PlaceholderInserted claiming success
  • Mail-merge placeholder emitted an unconditional trailing   that became permanent content and corrupted spacing in merged output
  • Setting BaseUrl to null crashed the editor with a NullReferenceException on the timer path
  • WPF: a family of content APIs (Get/SetBodyHtml, class name, body text, embed-images, etc.) silently no-op because the services used the WinForms-only browser.Document with no MSHTML fallback
  • Paste deleted the current selection before checking there was anything to paste
  • Set/get element-by-id APIs: NRE on null value, whole-document rewrite when the element is missing, and XPath breakage on IDs containing an apostrophe
  • Print margins corrupted on non-English locales: culture-formatted decimals written into IE's margin registry values
  • CanPaste threw when another process held the clipboard (unguarded Clipboard.ContainsImage)
  • A UTF-8 clipboard probe overwrote the user's clipboard and lost all non-text formats during paste
  • Parsing a style string with a duplicate CSS property name threw ArgumentException (duplicate declarations are legal CSS)
  • Hyperlink/element HTML builders emitted attribute values without HTML encoding, corrupting markup when a value contained a quote
  • Localization override JSON parser mangled escape sequences and mispaired keys for non-string values
  • Turkish-I bug: list toggle/unlist broke on Turkish and Azerbaijani systems because tagName.ToLower() never matched "li"
  • Insert Image dialog interpolated alt/title/src/class into the img tag with no HTML-attribute escaping - a double quote corrupted the document
  • Mail-merge built-in toolbars resolved the field by DisplayName, so duplicate display names always inserted the first field's token
  • WinForms placeholder toolbar docked ABOVE the regular toolbars, contradicting its documentation and WPF parity
  • Trial-expired startup could freeze the host (reentrant BodyHtml write inside the message pump; the Form_Load freeze fix covered only the Licensed branch)
  • Auto-opening the purchase page crashed the host when no browser/URL handler existed (unguarded Process.Start)
  • Process-wide one-shot license cache could be poisoned by a validation that ran before LicenseKey was assigned, and was never invalidated on key change
  • Replacing the public editor.Options property was silently ignored by the services layer, which had captured the original UserOption instance
  • Form close could hang: EditorDispose pumped Application.DoEvents in unbounded loops waiting for browser readiness, and the finalizer ran it too
  • Buffered property values were permanently dropped when setup post-processing threw (timer stopped before the work, despite a catch claiming a retry)
  • Font-name combo closed its dropdown on every KeyDown, making keyboard navigation of the font list impossible
  • FontDialog.FontSize crashed with FormatException when no size was selected, and parsed with current culture after formatting with invariant
  • Cached Image dialog leaked the previous image's width/height/border settings into every subsequently inserted image
  • CSS functional colors (rgb()/rgba()) crashed Table Properties and the Style Builder Background page (ColorConverter.ConvertFromString threw)
  • Browse-for-image crashed the app on a routine cancel path (raw throw "File doesn't exist" inside the LinkClicked handler)
  • Unbounded 'while (!IsReady) DoEvents()' pump loops could spin forever or crash when the browser never became ready