---
title: SAIF.Presentation.Web.Controls.AJAX.Infragistics111 business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
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 business rules

This page captures business rules enforced by this library.

## BR-AJAX-001: Bindable root object is the page's Model property

| Field | Value |
| --- | --- |
| **Statement** | The bindable root object is the hosting page's property literally named `Model`. |
| **Trigger** | Any binding operation |
| **Enforcement** | `SAIFAJAXControlAncestor.RootObject`, `BindingManager.GetRootObject` |
| **Outcome** | Pages must expose a `Model` property or nothing binds |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/SAIFAJAXControlAncestor.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingManager.vb` |

---

## BR-AJAX-002: Controls join automatic binding via iAutoBindingControl or their container

| Field | Value |
| --- | --- |
| **Statement** | A control participates in automatic binding if it implements `iAutoBindingControl` or its binding container does. |
| **Trigger** | `BindingManager.DataBind` and validity walks |
| **Enforcement** | `BindingManager.BindControl`, `CheckValidControls`, `GetErrorMessages` |
| **Outcome** | Composite editors bind through their container |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingManager.vb` |

---

## BR-AJAX-003: No root binding object means no binding

| Field | Value |
| --- | --- |
| **Statement** | A control with no root binding object performs no binding. |
| **Trigger** | `DataBind` |
| **Enforcement** | `AutoBindControlAncestor.DataBind` |
| **Outcome** | Unbound controls render their design value |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb` |

---

## BR-AJAX-004: Bound target resolved by walking the dotted BindSource path

| Field | Value |
| --- | --- |
| **Statement** | The bound target is located by walking the dotted `BindSource` path from the root object and then addressing the `BindProperty` on the result. |
| **Trigger** | Bind in either direction |
| **Enforcement** | `BindingUtility.GetObject`, `AutoBindControlAncestor.BoundObject` |
| **Outcome** | Nested model paths such as `Submission.Locations.Primary` are supported |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingUtility.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb` |

---

## BR-AJAX-005: Reflection failures during binding are suppressed

| Field | Value |
| --- | --- |
| **Statement** | Reflection failures during binding are suppressed rather than raised. |
| **Trigger** | Any bind or value transfer |
| **Enforcement** | `BindingUtility.GetObjectValue` / `SetObjectValue` / `BindValue` (`Catch … 'gobble'`) |
| **Outcome** | Misconfigured bindings fail silently |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingUtility.vb` |

---

## BR-AJAX-006: Controls validate automatically after bind and edit unless disabled

| Field | Value |
| --- | --- |
| **Statement** | A control validates itself automatically after data binding and after every user edit unless the corresponding switch is turned off. |
| **Trigger** | `DataBind`, `BindToObject` |
| **Enforcement** | `AutoValidateOnDataBind` and `AutoValidate` (both default `True`) |
| **Outcome** | Validation feedback without page code |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb` |

---

## BR-AJAX-007: A user edit is captured and pushed to the model immediately

| Field | Value |
| --- | --- |
| **Statement** | A user edit is captured on the editor's change event and immediately pushed to the model. |
| **Trigger** | `TextChanged` / `ValueChange` |
| **Enforcement** | `AutoBindTextbox`, `AutoBindWebMaskEdit`, `AutoBindWebDateTimeEdit` handlers |
| **Outcome** | Model stays current per postback |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindTextbox.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindWebMaskEdit.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindWebDateTimeEdit.vb` |

---

## BR-AJAX-008: Validation messages come from the bound object's IDataErrorInfo

| Field | Value |
| --- | --- |
| **Statement** | Validation messages come from the bound business object's `IDataErrorInfo` implementation for the bound property. |
| **Trigger** | Reading `ErrorMessages` |
| **Enforcement** | `AutoBindControlAncestor.GetErrorMessages` |
| **Outcome** | Business-layer rules drive UI validation |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb` |

---

## BR-AJAX-009: An unbound control reports no errors

| Field | Value |
| --- | --- |
| **Statement** | An unbound control reports no errors and is therefore considered valid. |
| **Trigger** | Reading `IsValid` |
| **Enforcement** | `AutoBindControlAncestor.GetErrorMessages` / `IsValid` |
| **Outcome** | Unbound controls never block a page |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb` |

---

## BR-AJAX-010: Duplicate validation messages are shown only once

| Field | Value |
| --- | --- |
| **Statement** | Duplicate validation messages are shown only once, separated by line breaks. |
| **Trigger** | Assembling messages |
| **Enforcement** | `AutoBindControlAncestor.Validate`, `BindingManager.AppendUniqueMessages` |
| **Outcome** | Deduplicated error display |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingManager.vb` |

---

## BR-AJAX-011: Validation messages are written to the page's LblErrorMsg label

| Field | Value |
| --- | --- |
| **Statement** | Validation messages are written to a page-level label whose ID is `LblErrorMsg`. |
| **Trigger** | `Validate` |
| **Enforcement** | `AutoBindControlAncestor.PageErrorLabel` |
| **Outcome** | Pages must provide that label |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb` |

---

## BR-AJAX-012: An invalid editor is highlighted red; a valid one is reset

| Field | Value |
| --- | --- |
| **Statement** | An invalid editor is highlighted in red; a valid one is reset. |
| **Trigger** | `StyleControl` |
| **Enforcement** | All three concrete auto-bind controls |
| **Outcome** | Visual error indication |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindTextbox.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindWebMaskEdit.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindWebDateTimeEdit.vb` |

---

## BR-AJAX-013: The page is valid only when every auto-binding control is valid

| Field | Value |
| --- | --- |
| **Statement** | The page is valid only when every auto-binding control on it is valid. |
| **Trigger** | Reading `BindingManager.IsValid` |
| **Enforcement** | `BindingManager.CheckValidControls` |
| **Outcome** | Single page-level validity gate |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingManager.vb` |

---

## BR-AJAX-014: A hover panel renders above all content and is hidden until shown

| Field | Value |
| --- | --- |
| **Statement** | A hover panel renders above all other page content and is hidden until the toolkit shows it. |
| **Trigger** | Hover panel layout |
| **Enforcement** | `HoverPanel.LayoutControls` (`Display: None`, `Z-INDEX: 99999999`) |
| **Outcome** | Popup is always visible when triggered |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPanel.vb` |

---

## BR-AJAX-015: Hover content is written unencoded

| Field | Value |
| --- | --- |
| **Statement** | Hover content is written to the page as supplied, without HTML encoding, so callers may embed markup. |
| **Trigger** | Hover panel layout |
| **Enforcement** | `HoverPanel`, `HoverPanelControl` (`TableCell.Text = ContentText`) |
| **Outcome** | Rich help markup is supported; unencoded content is a cross-site-scripting exposure if the text is not trusted |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPanel.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPanelControl.vb` |

---

## BR-AJAX-016: Hover controls render nothing when there is no content

| Field | Value |
| --- | --- |
| **Statement** | Hover controls render nothing when there is no content to show. |
| **Trigger** | Render |
| **Enforcement** | `HoverPanel.RenderContents`, `HoverPicture.RenderContents` |
| **Outcome** | No empty help icons or panels |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPanel.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPicture.vb` |

---

## BR-AJAX-017: Help text is identified by an application code and reference key with length ceilings

| Field | Value |
| --- | --- |
| **Statement** | Help text is identified by an application code (max 5 characters) plus a reference key value (max 40). |
| **Trigger** | Help retrieval |
| **Enforcement** | `clsHelpText.BeforeRetrieve` `AddParm` calls |
| **Outcome** | Parameter length ceilings enforced at the data request |
| **Tables** | [APPLICATION_HELP_MASTER](database-tables.md#application_help_master), [APPLICATION_HELP_DETAIL](database-tables.md#application_help_detail) |
| **SQL** | [SQL-001](sql/SQL-001-help-text-retrieve-by-key.md), [SQL-002](sql/SQL-002-help-text-list-retrieve.md) |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpText.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpTextCollection.vb` |

---

## BR-AJAX-018: Help content is assembled by joining master and detail on the reference key

| Field | Value |
| --- | --- |
| **Statement** | Help content is assembled by joining the help master record to its detail record on the reference key value. |
| **Trigger** | Help retrieval |
| **Enforcement** | `clsHelpText.Criteria.RetrieveSQL`, `clsHelpTextCollection.Criteria.RetrieveSQL` |
| **Outcome** | One combined description + text row |
| **Tables** | [APPLICATION_HELP_MASTER](database-tables.md#application_help_master), [APPLICATION_HELP_DETAIL](database-tables.md#application_help_detail) |
| **SQL** | [SQL-001](sql/SQL-001-help-text-retrieve-by-key.md), [SQL-002](sql/SQL-002-help-text-list-retrieve.md) |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpText.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpTextCollection.vb` |

---

## BR-AJAX-019: A help lookup that matches nothing yields empty text, not an error

| Field | Value |
| --- | --- |
| **Statement** | A help lookup that matches nothing yields an object with empty text rather than an error. |
| **Trigger** | Help retrieval |
| **Enforcement** | `clsHelpText.AfterRetrieve` (`If Reader.Read()`) |
| **Outcome** | Missing help degrades silently |
| **Tables** | [APPLICATION_HELP_MASTER](database-tables.md#application_help_master), [APPLICATION_HELP_DETAIL](database-tables.md#application_help_detail) |
| **SQL** | [SQL-001](sql/SQL-001-help-text-retrieve-by-key.md), [SQL-002](sql/SQL-002-help-text-list-retrieve.md) |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpText.vb` |

---

## BR-AJAX-020: Filling a help control with a null help object leaves content unchanged

| Field | Value |
| --- | --- |
| **Statement** | Filling a help control with a null help object leaves the existing content unchanged. |
| **Trigger** | `HoverHelp.Fill` |
| **Enforcement** | `HoverHelp.Fill(clsHelpText)` |
| **Outcome** | No null-reference failure |
| **SQL** | [SQL-001](sql/SQL-001-help-text-retrieve-by-key.md) |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverHelp.vb` |

---

## BR-AJAX-021: Grid customization state is created once per grid per model and reused

| Field | Value |
| --- | --- |
| **Statement** | Grid customization state is created once per grid per model and reused on subsequent postbacks. |
| **Trigger** | Reading `ModalGridCustomizer.GridCustomizer` |
| **Enforcement** | `ModalGridCustomizer.GridCustomizer` (`GridCustomizers` list lookup) |
| **Outcome** | Column choices persist across postbacks |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb` |

---

## BR-AJAX-022: A saved page size overrides the designed page size when the customizer controls paging

| Field | Value |
| --- | --- |
| **Statement** | A user's saved page size overrides the grid's designed page size when the customizer controls paging. |
| **Trigger** | Customizer construction |
| **Enforcement** | `InfragisticsGridCustomizer.New` / `PageSizePreference` |
| **Outcome** | Personalized page size |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-023: Page size defaults to 50 rows; paging shown only at two or more pages

| Field | Value |
| --- | --- |
| **Statement** | Absent any other source, the page size defaults to 50 rows and paging is only displayed once there are at least 2 pages. |
| **Trigger** | Customizer construction / `ManipulateGrid` |
| **Enforcement** | `DefaultPageSize = 50`, `MinimumPagesForDisplay = 2` |
| **Outcome** | Consistent paging defaults |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-024: Every override column must exist on the target grid

| Field | Value |
| --- | --- |
| **Statement** | Every column named in an always-visible or always-hidden override must exist on the target grid. |
| **Trigger** | Customizer construction |
| **Enforcement** | `InfragisticsGridCustomizer.ValidateColumnVisibilitySettings` |
| **Outcome** | `ApplicationException` naming the grid and the offending column |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-025: A column's initial visibility is derived from the grid definition

| Field | Value |
| --- | --- |
| **Statement** | A column's initial visibility is derived from the grid definition: hidden or server-only columns start invisible. |
| **Trigger** | Customizer construction |
| **Enforcement** | `InfragisticsGridCustomizer.InitializeColumnList` |
| **Outcome** | Designer intent is the starting state |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-026: An always-hidden column is forced server-only; others are cleared

| Field | Value |
| --- | --- |
| **Statement** | An always-hidden column is forced server-only; all other columns have their hidden and server-only flags cleared so the customizer alone controls visibility. |
| **Trigger** | `HidableInfragisticsColumn.New` |
| **Enforcement** | `HidableInfragisticsColumn` constructor |
| **Outcome** | Single point of visibility control |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-027: A saved preference for a removed column is ignored

| Field | Value |
| --- | --- |
| **Statement** | A saved column preference for a column that no longer exists in the grid is ignored. |
| **Trigger** | Loading preferences |
| **Enforcement** | `InfragisticsGridCustomizer.LoadColumnPreferences` |
| **Outcome** | Renamed/removed columns do not break the page |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-028: Always-visible or always-hidden columns cannot be changed

| Field | Value |
| --- | --- |
| **Statement** | Columns marked always-visible or always-hidden cannot be changed by the user or by saved preferences. |
| **Trigger** | Loading preferences, `Update`, `ManipulateGrid` |
| **Enforcement** | `LoadColumnPreferences`, `ManipulateGrid` (`VisibilityMode = Normal` guard) |
| **Outcome** | Mandatory columns stay mandatory |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-029: The page-size editor accepts at most three digits

| Field | Value |
| --- | --- |
| **Statement** | The page-size editor accepts at most three digits. |
| **Trigger** | Panel layout |
| **Enforcement** | `GridCustomizationPanel.LayoutControls` (`InputMask = "###"`) |
| **Outcome** | Page size capped at 999 |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb` |

---

## BR-AJAX-030: Select-All / Deselect-All operate entirely on the client

| Field | Value |
| --- | --- |
| **Statement** | Select-All / Deselect-All operate entirely on the client and never post back. |
| **Trigger** | Link button click |
| **Enforcement** | `SelectAllCheckboxList` in `SAIFAJAXControls.js`; `OnClientClick` returns `false` |
| **Outcome** | Instant toggling with no round trip |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/SAIFAJAXControls.js`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb` |

---

## BR-AJAX-031: The client script is registered from a fixed application path

| Field | Value |
| --- | --- |
| **Statement** | The client script is registered from a fixed application path, `/Resources/Scripts/SAIFAJAXControls.js`. |
| **Trigger** | Panel layout |
| **Enforcement** | `GridCustomizationPanel.LayoutControls` |
| **Outcome** | Hosting applications must publish the script at that path |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb` |

---

## BR-AJAX-032: Always-hidden columns are not offered to the user

| Field | Value |
| --- | --- |
| **Statement** | Always-hidden columns are not offered to the user for selection. |
| **Trigger** | Building the checkbox list |
| **Enforcement** | `InfragisticsGridCustomizer.ListItems` |
| **Outcome** | User cannot reveal internal columns |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-033: A column with no header caption is labeled from its key

| Field | Value |
| --- | --- |
| **Statement** | A column with no header caption is labelled by splitting its key on capital letters. |
| **Trigger** | Building the checkbox list |
| **Enforcement** | `ListItems` (`PadCapitalLettersFormat`) |
| **Outcome** | Readable label even without a designer-supplied caption |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-034: Always-visible columns appear checked but disabled

| Field | Value |
| --- | --- |
| **Statement** | Always-visible columns appear checked but disabled. |
| **Trigger** | Building the checkbox list |
| **Enforcement** | `ListItems` (`li.Enabled = c.VisibilityMode <> AlwaysVisible`) |
| **Outcome** | Mandatory columns visibly locked |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-035: The checkbox list is laid out to keep at most ten items per column

| Field | Value |
| --- | --- |
| **Statement** | The column checkbox list is laid out in as many columns as needed to keep at most ten items per column, unless explicitly overridden. |
| **Trigger** | Panel initialization |
| **Enforcement** | `GridCustomizationPanel.GetRepeatColumns` |
| **Outcome** | Compact popup layout |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb` |

---

## BR-AJAX-036: The Apply button is offered only when an async refresh target is configured

| Field | Value |
| --- | --- |
| **Statement** | The Apply button is offered only when an asynchronous refresh target has been configured. |
| **Trigger** | Panel layout |
| **Enforcement** | `GridCustomizationPanel` (`OKButton.Visible = AsynchronousGridRefresh`) |
| **Outcome** | No non-functional Apply button |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb` |

---

## BR-AJAX-037: Confirming the popup applies choices for the session only

| Field | Value |
| --- | --- |
| **Statement** | Confirming the popup applies the user's column and page-size choices to the grid for the current session but does not save them. |
| **Trigger** | OK / Apply click |
| **Enforcement** | `ModalGridCustomizer.CustomizationPanel_OKButtonClicked` |
| **Outcome** | Temporary customization |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb` |

---

## BR-AJAX-038: The rebind strategy after customization is chosen by the consumer

| Field | Value |
| --- | --- |
| **Statement** | How the grid is rebound after customization is chosen by the consumer: object binder, native data bind, or a custom page handler. |
| **Trigger** | Rebind after OK/Apply |
| **Enforcement** | `ModalGridCustomizer.CustomizationPanel_BindGrid` (`BindingBehaviors`) |
| **Outcome** | Flexible integration |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb` |

---

## BR-AJAX-039: Only "Save as Default" persists grid preferences

| Field | Value |
| --- | --- |
| **Statement** | Only "Save as Default" persists the user's grid preferences. |
| **Trigger** | Save-as-Default click |
| **Enforcement** | `ModalGridCustomizer.CustomizationPanel_SavePreferences` → `InfragisticsGridCustomizer.SavePreferences` → `clsPreferences.Save` |
| **Outcome** | Choices survive future sessions |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-040: Hiding a column removes it entirely; re-showing reinserts it at its original position

| Field | Value |
| --- | --- |
| **Statement** | Hiding a column removes it from the grid entirely rather than merely hiding it, and re-showing it reinserts it at its original ordinal position. |
| **Trigger** | `ManipulateGrid` |
| **Enforcement** | `InfragisticsGridCustomizer.ManipulateGrid` |
| **Outcome** | Hidden column data is not sent to the client |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-041: Customizer-controlled paging is always switched on

| Field | Value |
| --- | --- |
| **Statement** | When the customizer controls paging, paging is switched on for the grid regardless of its designed setting. |
| **Trigger** | `ManipulateGrid` |
| **Enforcement** | `InfragisticsGridCustomizer.ManipulateGrid` |
| **Outcome** | Consistent paging behaviour |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb` |

---

## BR-AJAX-042: Date editors display and edit in MM/dd/yyyy format

| Field | Value |
| --- | --- |
| **Statement** | Date editors display and edit in `MM/dd/yyyy` format. |
| **Trigger** | Date control layout |
| **Enforcement** | `AutoBindWebDateTimeEdit.LayoutControls` |
| **Outcome** | Fixed US date format, not culture-driven |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindWebDateTimeEdit.vb` |

---

## BR-AJAX-043: Default help and customizer icons are served from fixed resource paths

| Field | Value |
| --- | --- |
| **Statement** | The default help icon is served from `/Resources/Images/DefaultHelpImage.gif` and the grid customizer icon from `/Resources/Images/DefaultModalGridCustomizer.gif` when no image is configured. |
| **Trigger** | Control layout |
| **Enforcement** | `HoverHelp.LayoutControls`, `ModalGridCustomizer.LayoutControls` |
| **Outcome** | Hosting applications must publish those images |
| **Source** | `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverHelp.vb`, `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb` |

---

## Inherited business rules

Rules in this section originate from base classes or services provided by dependency framework libraries. They are enforced by inherited behavior, not by code in this library. The originating class and library are recorded in each rule's **Origin** field.

## INH-AJAX-001: Business objects route Create/Retrieve requests through IBusinessCriteria-driven data-portal operations

| Field | Value |
| --- | --- |
| **Statement** | Business objects implementing `IBusinessCriteria` (such as `clsHelpText.Criteria` and `clsHelpTextCollection.Criteria`) route Create and Retrieve calls through the data portal's `IDataAccess.CreateObject(criteria)` / `IDataAccess.RetrieveObject(criteria)` operations, using an `IBusinessCriteria` or `IBusinessApiCriteria` instance with populated `DataPortalInfo`.† |
| **Trigger** | Any `CreateObject` / `RetrieveObject` call against a criteria instance |
| **Enforcement** | `SAIF.Framework.Core` data-portal pipeline (`IDataAccess.CreateObject` / `IDataAccess.RetrieveObject`)† |
| **Outcome** | Consistent CRUD dispatch across all `IBusinessCriteria` implementations, including this library's `clsHelpText.Criteria` and `clsHelpTextCollection.Criteria`† |
| **Origin** | `SAIF.Framework.Core` — `IBusinessCriteria` |
| **Source** | Retrieved from indexed documentation via Legends CLI |

---

## Notes
- `AutoBindControlAncestor.Validate` always returns `True` regardless of validity, although the `iAutoBindingControl` contract implies a boolean result; no caller in this repository appears to use the return value.*
- `ModalGridCustomizer` declares `MGC_`-prefixed preference-key constants that are never used — the actual keys come from `InfragisticsGridCustomizer`'s `IGC_` constants.**
- `ModalGridCustomizer` declares a public `OnInitialize` event that is never raised.*
- `GridCustomizationPanel` raises `AfterRender` from `CreateChildControls` rather than from a render-phase method — the event name does not match when it fires.*
- Mark inferred statements with `*` and unknown statements with `**`. Do not use bold inline confidence labels.
- Statements marked with `†` were retrieved from dependency library documentation via the Legends CLI RAG service.

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

> **Note:** Statements marked with `†` are derived from dependency library documentation via the Legends CLI. Statements marked with `*` were inferred from code structure or contextual evidence. 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/AutoBindTextbox.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindWebMaskEdit.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindWebDateTimeEdit.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingManager.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingUtility.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPanel.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPanelControl.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverPicture.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/HoverHelp.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpText.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpTextCollection.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb`
- `SAIF.Presentation.Web.Controls.AJAX.Infragistics111/SAIFAJAXControls.js`
