---
title: SAIF.Presentation.Web.Controls.AJAX.Infragistics103 architecture
summary: Architectural responsibilities, boundaries, and interaction patterns for the AJAX/Infragistics WebForms control library.
status: draft
owner: SAIF documentation generator
last_reviewed: 2026-08-17
library: SAIF.Presentation.Web.Controls.AJAX.Infragistics103
reference_type: package
---

# SAIF.Presentation.Web.Controls.AJAX.Infragistics103 architecture

This library is a presentation-tier UI control library for classic ASP.NET WebForms — the "V2 AJAX" generation of SAIF's Infragistics-based control set (`RootNamespace=SAIF.Presentation.Web.Controls.V2.AJAX`)*. It sits above `SAIF.Presentation.Web.Controls.V2` (base widgets) and `SAIF.Presentation.Web.Binding.Infragistics103` (object-binding infrastructure), and consumes a small number of SAIF BOF business objects directly (`clsHelpText`/`clsHelpTextCollection`) for read-only help-text lookups against `APPLICATION_HELP_MASTER`/`APPLICATION_HELP_DETAIL`.

## Responsibilities
- Provide reflection-based auto-binding editor controls (`AutoBindTextbox`, `AutoBindWebDateTimeEdit`, `AutoBindWebMaskEdit`) that bind a control's `Value` to a dotted property path on a page-level model object, and surface the bound object's own `IDataErrorInfo` validation messages.
- Orchestrate page-wide binding/validation aggregation via `BindingManager`, which walks the full `Page.Controls` tree, assigns the model (`RootObject`) to every `iAutoBindingControl`, and aggregates `IsValid`/`ErrorMessages`.
- Render hover-help / hover-panel UI (`HoverPanel`, `HoverPanelControl`, `HoverLabel`, `HoverPicture`, `HoverHelp`, `HoverHelpControl`) built on the AJAX Control Toolkit's `HoverMenuExtender`.
- Retrieve read-only, database-backed help text for a screen field or an entire application via `clsHelpText`/`clsHelpTextCollection` (SAIF BOF business objects, retrieve-only — `Create`/`Insert`/`Update`/`Delete` SQL paths are unsupported stubs).
- Provide end-user grid column visibility/paging customization for `UltraWebGrid` instances (`InfragisticsGridCustomizer`, `HidableInfragisticsColumn`, `ColumnPreferenceList`, `GridCustomizationPanel`, `ModalGridCustomizer`), persisting user choices to a per-user preference store (`clsPreferences`).

## Component boundaries
- **Auto-binding editor family** (`AutoBindControlAncestor` → `AutoBindTextbox`, `AutoBindWebDateTimeEdit`, `AutoBindWebMaskEdit`, plus the `iAutoBindingControl` contract and `BindingUtility`/`BindingManager` helpers): owns reflection-based get/set/validate plumbing against an in-memory business object; performs no direct SQL/table access itself.
- **Hover-help / hover-panel family** (`HoverPanel`, `HoverPanelControl`, `HoverLabel`, `HoverPicture`, `HoverHelp`, `HoverHelpControl`): owns rendering of `HoverMenuExtender`-based popups; `HoverHelp` is the only member that crosses into data access, via the `clsHelpText` business object.
- **Help-text data access** (`clsHelpText`, `clsHelpTextCollection`): owns the sole database-facing boundary in this library — two `IBusinessCriteria` implementations issuing read-only SQL against `APPLICATION_HELP_MASTER`/`APPLICATION_HELP_DETAIL` on an Oracle database*, inferred from colon-prefixed bind-variable syntax rather than directly confirmed.
- **Grid customization family** (`InfragisticsGridCustomizer`, `HidableInfragisticsColumn`, `ColumnPreferenceList`, `GridCustomizationPanel`, `ModalGridCustomizer`, `InfragisticsGridCustomizerList`): owns end-user column visibility/paging state for `UltraWebGrid` and its persistence to `clsPreferences`**.
- **`SAIFAJAXControlAncestor`**: shared root for the AJAX display-control families in this library (`CompositeControl`-derived), resolving the page model (`RootObject`) and browser-detection helpers (`IsFirefox`). `BindingManager` is an exception: it inherits directly from `CompositeControl` rather than from `SAIFAJAXControlAncestor`.
- **Excluded from the compiled boundary**: `AutoBindTextboxControl.vb` and `AutoBindingControl.vb` exist on disk but are not in the `.vbproj` `<Compile>` item group, so they are not part of the shipped assembly*.

## Interaction model
- Hosting ASPX pages (outside this library) invoke `BindingManager.DataBind()` once a page model is available; this recursively walks `Page.Controls`, assigns `RootBindingObject` on each `iAutoBindingControl`, and lets the standard ASP.NET control lifecycle invoke each control's own `DataBind()`.
- Each auto-binding control resolves its bound value via `BindingUtility.GetObject`/`BindValue` (reflection over a dotted property path) and writes user edits back to the bound object on postback (`BindToObject`), optionally re-validating against the bound object's `IDataErrorInfo` implementation.
- `HoverHelp` renders help content sourced from an already-retrieved `clsHelpText` instance; the business object itself is retrieved via its shared factory (`GetHelpText`/`GetHelpTexts`), which drives the BOF data-portal pipeline (`BeforeRetrieve`/`AfterRetrieve`) against an Oracle database*.
- `ModalGridCustomizer` mediates between the hosting page's `UltraWebGrid`, an `InfragisticsGridCustomizer` (in-memory column/paging state), a `GridCustomizationPanel` popup (user interaction), and `clsPreferences` (persisted defaults), rebinding the grid via `ObjectBinder`, `DataBind`, or a `Custom` re-raised event depending on configured `BindingBehavior`.
- Controls rely on the Infragistics `WebAsyncRefreshPanel` (WARP) and ASP.NET `UpdatePanel` for partial-page (AJAX) postbacks; `SAIFAJAXControls.js` supplies one client-side helper (`SelectAllCheckboxList`) for bulk-toggling the grid-customizer column checkbox list.

## Architecture diagram
The following diagram shows the four component families in this library and their primary collaborators.

```mermaid
flowchart TD
	Page[Hosting ASPX page<br>model / Page.Controls]
	BM[BindingManager]
	ABC[AutoBindControlAncestor family<br>AutoBindTextbox / WebDateTimeEdit / WebMaskEdit]
	BU[BindingUtility<br>reflection get/set/bind]
	HH[Hover-help / hover-panel family<br>HoverHelp / HoverPanel / HoverLabel / HoverPicture]
	CHT[clsHelpText / clsHelpTextCollection<br>SAIF BOF business objects]
	DB[(Oracle*<br>APPLICATION_HELP_MASTER / DETAIL)]
	GC[Grid customization family<br>ModalGridCustomizer / InfragisticsGridCustomizer]
	PREF[clsPreferences<br>per-user preference store]
	GRID[UltraWebGrid]

	Page --> BM
	BM --> ABC
	ABC --> BU
	BU --> Page
	HH --> CHT
	CHT --> DB
	Page --> GC
	GC --> GRID
	GC --> PREF
```

## Sequence diagram
The following diagram shows the primary help-text retrieval and rendering sequence used by `HoverHelp`.

```mermaid
sequenceDiagram
	participant Page as Hosting page
	participant HoverHelp
	participant clsHelpText
	participant DataPortal as BOF data portal
	participant Oracle as APPLICATION_HELP_MASTER/DETAIL (Oracle*)

	Page->>clsHelpText: GetHelpText(dataPortal, appCode, refKeyValue)
	clsHelpText->>DataPortal: RetrieveObject(Criteria)
	DataPortal->>Oracle: RetrieveSQL (bind ApplicationCode, ReferenceKeyValue)
	Oracle-->>DataPortal: joined row (help text + description)
	DataPortal-->>clsHelpText: Fill() populates fields, MarkOld()
	clsHelpText-->>Page: populated read-only instance
	Page->>HoverHelp: Fill(clsHelpText instance)
	HoverHelp-->>Page: renders hover icon + popup text
```

## Design constraints
- The library targets .NET Framework v4.6.1 (VB.NET, `OptionStrict On`) and classic ASP.NET WebForms; no `.aspx`/`.ascx` markup exists in this project — all controls are rendered entirely from code-behind (`CompositeControl`-derived classes).
- `clsHelpText`/`clsHelpTextCollection` are read-only by design: `CreateSQL`, `InsertSQL`, `UpdateSQL`, and `DeleteSQL` all throw `ApplicationException(BOC.Messages.InvalidSQLProperty)` — attempting to save/delete an instance fails at the point the base class reads the corresponding SQL property.
- Auto-binding validation is a generic UI mechanism only: this library does not itself define what constitutes invalid data — validity is determined entirely by the bound business object's own `IDataErrorInfo` implementation, which resides outside this project**.
- `AutoBindControlAncestor.PageErrorLabel` depends on a page control named `LblErrorMsg` being present in the control tree; if absent, error-message assignment silently no-ops (swallowed `NotSupportedException`)*.
- `InfragisticsGridCustomizer` hard-fails (`ApplicationException`) at initialization if a configured `AlwaysVisible`/`AlwaysHidden` column key does not exist on the target grid, and `TargetGrid`/`ObjectBinder` property getters throw if the named control cannot be resolved via `Page.FindControl`.
- Two source files (`AutoBindTextboxControl.vb`, `AutoBindingControl.vb`) exist on disk but are excluded from the `.vbproj` compile list and are therefore not part of the shipped assembly*.
- The concrete type and persistence mechanism of `clsPreferences` is inferred to originate from `SAIF.Framework.Preferences` based on the referenced assembly name, but no `Imports`/usage in this project's source directly confirms it**.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [Business rules](business-rules.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [Control catalog](control-catalog.md)
- [API reference](api/index.md)

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with ** could not be confirmed; treat as unknown until verified.

## Sources
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\SAIF.Presentation.Web.Controls.AJAX.Infragistics103.vbproj`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\SAIFAJAXControlAncestor.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\AutoBindControlAncestor.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\AutoBindTextbox.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\AutoBindWebDateTimeEdit.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\AutoBindWebMaskEdit.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\BindingManager.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\BindingUtility.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\iAutoBindingControl.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\HoverHelp.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\HoverHelpControl.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\HoverLabel.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\HoverPanel.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\HoverPanelControl.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\HoverPicture.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\GridCustomizationPanel.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\InfragisticsGridCustomizer.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\ModalGridCustomizer.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\clsHelpText.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\clsHelpTextCollection.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics103\SAIFAJAXControls.js`
