---
title: SAIF.Presentation.Web.Controls.AJAX.Infragistics111 architecture
summary: Architectural responsibilities, boundaries, and interaction patterns.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-08-17
library: SAIF.Presentation.Web.Controls.AJAX.Infragistics111
reference_type: package
---

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

`SAIF.Presentation.Web.Controls.AJAX.Infragistics111` is a WebForms server-control library that layers AJAX Control Toolkit and Infragistics 11.1 behavior onto the SAIF presentation stack. It provides three capability groups: **auto-binding editors** that bind themselves to a page model by reflection and surface `IDataErrorInfo` validation messages; **hover help controls** built on the toolkit's `HoverMenuExtender`, optionally fed from the `APPLICATION_HELP_*` tables through two BOF business objects; and an **Infragistics grid customizer** that lets a user choose visible grid columns and page size in a modal popup and persist those choices as user preferences.

## Responsibilities
- Provide reflection-based, two-way, convention-driven data binding between page controls and a hosting page's `Model` property, including validation surfaced through the bound object's `IDataErrorInfo`.
- Provide hover-help UI (`HoverPanel`, `HoverLabel`, `HoverPicture`, `HoverHelp`, `HoverHelpControl`) built on the AJAX Control Toolkit's `HoverMenuExtender`, optionally backed by the `clsHelpText`/`clsHelpTextCollection` BOF business objects.
- Let a user customize an `UltraWebGrid`'s visible columns and page size in a modal popup, and persist those choices as per-user preferences (`InfragisticsGridCustomizer`).
- Sit at the top of the intra-package presentation dependency chain, composing [SAIF.Presentation.Web.Controls.Infragistics111](../saif-presentation-web-controls-infragistics111/overview.md) and `SAIF.Presentation.Web.Binding.Infragistics111`.

## Component boundaries
- **`SAIFAJAXControlAncestor`** (extends `System.Web.UI.WebControls.CompositeControl`): root ancestor for every control in this library; exposes the page's `Model` as `RootObject` and a browser-detection helper.
- **`AutoBindControlAncestor`** (implements `iAutoBindingControl`) and its concrete editors `AutoBindTextbox`, `AutoBindWebMaskEdit`, `AutoBindWebDateTimeEdit`: reflection-based two-way binding, validation, and error display, each wrapped in an Infragistics WARP inside a hover-trigger panel.
- **`BindingManager`**: page-level orchestrator that pushes the root model into every `iAutoBindingControl` on the page and aggregates `IsValid`/`ErrorMessages`.
- **`BindingUtility`**: shared reflection/`TypeDescriptor`-based helper (`GetObject`, `GetObjectValue`, `SetObjectValue`, `BindValue`) used by the auto-binding controls.
- **Hover-help family** (`HoverPanel`, `HoverPanelControl`, `HoverLabel`, `HoverPicture`, `HoverHelp`, `HoverHelpControl`): presentation-only, independent of the binding sub-system except for a shared ancestor.
- **Grid customization family** (`ModalGridCustomizer`, `GridCustomizationPanel` (`Friend`), `InfragisticsGridCustomizer`, `InfragisticsGridCustomizerList`, `HidableInfragisticsColumn`, `ColumnPreferenceList`): a self-contained popup-based column/page-size editor for `UltraWebGrid` that persists state through `clsPreferences`.
- **`clsHelpText` / `clsHelpTextCollection`** (BOF business objects, inherit `clsBusinessBase` / `clsBusinessCollectionBase`): read-only help text lookup by application code and reference key, backing the hover-help controls.

## Interaction model
- Every control expects the hosting page to expose a property named `Model`; `BindingManager.RootObjectName` is publicly settable but the private `GetRootObject` hard-codes `"Model"`, so the setting is not honored.*
- Binding paths are dotted strings (`BindSource`, e.g. `Submission.Locations.Primary`) walked by `BindingUtility.GetObject` via reflection/`TypeDescriptor`, with no compile-time checking; `BindingUtility` swallows all exceptions, so a mistyped path fails silently.*
- Validation reuses the bound object's `IDataErrorInfo` implementation; error text is split on CRLF into individual messages and rendered without HTML encoding.*
- `ModalGridCustomizer` composes `GridCustomizationPanel` (the modal popup body) with `InfragisticsGridCustomizer` (per-grid column/page-size state) and, depending on `BindingBehavior`, rebinds the grid through `SAIF.Presentation.Web.Binding.Infragistics111`'s `clsObjectBindManager` — a second, parallel binding mechanism alongside this library's own reflection-based binding.*
- Per-page grid-customizer instances are cached in an `InfragisticsGridCustomizerList` held on the model under `GridCustomizers`, keyed by grid ID, so column state survives postbacks for the life of the model.*
- Column and page-size preferences are read/written via `clsPreferences` obtained by reflection from the model's `Preferences` property, using composite keys `IGC_<gridId>_ColumnSelection` and `IGC_<gridId>_PageSize`.

## Architecture diagram
The following diagram shows the three cooperating sub-systems that share one ancestor but are otherwise independent.

```mermaid
flowchart TD
	ANC["SAIFAJAXControlAncestor<br>CompositeControl"] --> ABA["AutoBindControlAncestor<br>iAutoBindingControl"]
	ANC --> HP["HoverPanel / HoverPanelControl"]
	ANC --> HL["HoverLabel / HoverPicture / HoverHelpControl"]
	ANC --> GCP["GridCustomizationPanel (Friend)"]
	ANC --> MGC["ModalGridCustomizer"]
	ABA --> ABT["AutoBindTextbox"]
	ABA --> ABM["AutoBindWebMaskEdit"]
	ABA --> ABD["AutoBindWebDateTimeEdit"]
	HP --> HH["HoverHelp"]
	HL --> HH
	HH --> HT["clsHelpText / clsHelpTextCollection<br>clsBusinessBase"]
	MGC --> GCP
	MGC --> IGC["InfragisticsGridCustomizer<br>+ HidableInfragisticsColumn<br>+ ColumnPreferenceList"]
	BM["BindingManager"] --> ABA
	ABA --> BU["BindingUtility (reflection)"]
	IGC --> PREF["clsPreferences<br>SAIF.Framework.Preferences"]
```

## Sequence diagram
The following diagram shows a user customizing grid columns through the modal popup and the resulting preference persistence.

```mermaid
sequenceDiagram
	participant User
	participant MGC as ModalGridCustomizer
	participant GCP as GridCustomizationPanel
	participant IGC as InfragisticsGridCustomizer
	participant Pref as clsPreferences
	participant Grid as UltraWebGrid
	User->>MGC: Open customizer (ModalPopupExtender)
	MGC->>GCP: Render column checkbox list
	User->>GCP: Toggle columns, click OK/Apply
	GCP->>IGC: Update(selected columns, page size)
	IGC->>Pref: SavePreferences (IGC_<gridId>_ColumnSelection / PageSize)
	IGC->>Grid: ManipulateGrid - remove deselected columns
	Grid-->>User: Updated grid rendering
```

## Design constraints
- `Option Strict` is `Off` at the project level (a few files opt in to `Option Strict On`), permitting late binding across most of the library.*
- The binding mechanism in this library is separate from and parallel to `SAIF.Presentation.Web.Binding.Infragistics111`'s `clsObjectBindManager`, which it also consumes for grid rebinding — two independent binding mechanisms coexist in the presentation stack.*
- Hover content, validation messages, and link-button text are rendered without HTML encoding; because validation text can originate from user-entered values and help text from a database table, unencoded rendering is a potential stored/reflected cross-site-scripting exposure if either source is not fully trusted.*
- No authentication or authorization logic exists in this library — help text retrieval has no user filter and no role/permission check is present anywhere.
- Several hard-coded hosting-environment paths are required at runtime (`/Resources/Scripts/SAIFAJAXControls.js`, `/Resources/Images/DefaultHelpImage.gif`, `/Resources/Images/DefaultModalGridCustomizer.gif`); the packaging `.nuspec` ships only `.vb` source, so consumers must supply these assets independently.*
- `clsHelpTextCollection` inherits the non-generic `clsBusinessCollectionBase` rather than the generic `clsBusinessCollection(Of T)` used elsewhere in the packaged set, suggesting an older framework generation.**

## 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)
- [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.Infragistics111/SAIFAJAXControlAncestor.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingManager.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingUtility.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpText.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpTextCollection.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/SAIF.Presentation.Web.Controls.AJAX.Infragistics111.vbproj`
