---
title: SAIF.Presentation.Web.Controls.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.Infragistics111
reference_type: package
---

# SAIF.Presentation.Web.Controls.Infragistics111 business rules

This page captures business rules enforced by this library. All rules below are presentation/formatting rules; none are policy, claim, or premium rules.

## BR-CTL-001: Filter child drop-down by parent value

| Field | Value |
| --- | --- |
| **Statement** | The child column's drop-down list must show only the options associated with the parent column's current cell value. |
| **Trigger** | User enters edit mode on a grid cell. |
| **Enforcement** | `clsDropDownController.GenerateJavaScript` (emitted `switch(catCell)` and key guard), wired via `BeforeEnterEditModeHandler`. |
| **Outcome** | Child value list is replaced with the filtered subset before editing begins. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/clsDropDownController.vb` |

---

## BR-CTL-002: Case-insensitive parent-child key match

| Field | Value |
| --- | --- |
| **Statement** | Parent-to-child association is matched case-insensitively on the child item's key property. |
| **Trigger** | Script generation during `DataBind`. |
| **Enforcement** | `clsDropDownController.GenerateJavaScript` (`item2.key.ToUpper = item1.id.ToUpper`). |
| **Outcome** | Child options group under the parent code regardless of letter case. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/clsDropDownController.vb` |

---

## BR-CTL-003: Cascade handler name derived from child column key

| Field | Value |
| --- | --- |
| **Statement** | The generated cascade handler is named `BeforeEdit` plus the child column key, so multiple controllers on one page do not collide.* |
| **Trigger** | `DataBind` / script generation. |
| **Enforcement** | `clsDropDownController.DataBind` and `GenerateJavaScript`. |
| **Outcome** | Each controlled column gets a uniquely named handler. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/clsDropDownController.vb` |

---

## BR-CTL-004: Explicit value and display members required for cascaded columns

| Field | Value |
| --- | --- |
| **Statement** | Both cascaded columns must be bound with an explicit value member and display member supplied by the consumer. |
| **Trigger** | `DataBind`. |
| **Enforcement** | `clsDropDownController.DataBind` (`ValueList.ValueMember` / `DisplayMember` assignment). |
| **Outcome** | Grid cells display the description while storing the code. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/clsDropDownController.vb` |

---

## BR-CTL-005: Only string-convertible properties populate generated lists

| Field | Value |
| --- | --- |
| **Statement** | Only source properties whose type has a converter to `System.String` contribute to the generated list. |
| **Trigger** | `DataBind` projection loops. |
| **Enforcement** | `clsDropDownController.DataBind` (`converter.CanConvertTo(Type.GetType("System.String"))`). |
| **Outcome** | Non-string-convertible members are skipped rather than failing the bind. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/clsDropDownController.vb` |

---

## BR-CTL-006: Generated script values are not encoded

| Field | Value |
| --- | --- |
| **Statement** | Item codes and descriptions are emitted into JavaScript string literals without encoding.** |
| **Trigger** | Script generation. |
| **Enforcement** | `clsDropDownController.GenerateJavaScript`. |
| **Outcome** | A value containing a quote or script terminator would break or alter the emitted script; treat as an injection risk pending review. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/clsDropDownController.vb` |

---

## BR-CTL-007: Client script wiring skipped in design mode

| Field | Value |
| --- | --- |
| **Statement** | Client-script wiring must not execute at design time. |
| **Trigger** | Control `Init` / `PreRender` in the Visual Studio designer. |
| **Enforcement** | `SAIFWarp` (`If Not DesignMode`). |
| **Outcome** | Designer rendering is unaffected by runtime scripts. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWarp.vb` |

---

## BR-CTL-008: Each shared script block registered once per page

| Field | Value |
| --- | --- |
| **Statement** | Each shared client script block is registered at most once per page. |
| **Trigger** | Control `Init` / `PreRender`. |
| **Enforcement** | `SAIFWarp` (`IsClientScriptBlockRegistered` / `IsStartupScriptRegistered` guards), `SAIFWebDateTimeEdit`. |
| **Outcome** | Multiple instances of the control on one page emit one copy of each script. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWarp.vb`, `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWebDateTimeEdit.vb` |

---

## BR-CTL-009: Focus target carried to client in a hidden field

| Field | Value |
| --- | --- |
| **Statement** | The control that should regain focus after an async refresh is carried to the client in a hidden field named `<ControlID>_FOCUS`. |
| **Trigger** | `CreateChildControls` and `RenderContents`. |
| **Enforcement** | `SAIFWarp.CreateChildControls`, `SAIFWarp.RenderContents`. |
| **Outcome** | Client script can resolve and focus the intended control after refresh. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWarp.vb` |

---

## BR-CTL-010: Async failures above severity threshold redirect to the error page

| Field | Value |
| --- | --- |
| **Statement** | Asynchronous callback failures above severity `flags > 1` redirect the browser to the central error page `/weberror/processError.aspx`. |
| **Trigger** | Infragistics panel client `Error` event. |
| **Enforcement** | `SAIFWarp` `ERROR_SCRIPT` via `ClientSideEvents.Error`. |
| **Outcome** | User is routed to the standard error screen with the message in the `MSG` query string. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWarp.vb` |

---

## BR-CTL-011: Focus restoration failures do not break the page

| Field | Value |
| --- | --- |
| **Statement** | After a successful async refresh, focus restoration failures must not break the page, and a page-supplied `AdditionRefreshComplete` hook is invoked when present. |
| **Trigger** | Client `RefreshComplete` event. |
| **Enforcement** | `SAIFWarp` `FOCUS_SCRIPT` (`try`/`catch` blocks). |
| **Outcome** | Errors are swallowed; optional page hook still runs. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWarp.vb` |

---

## BR-CTL-012: Focusing a sentinel date clears the field

| Field | Value |
| --- | --- |
| **Statement** | Focusing a date editor whose displayed value is a sentinel date clears the field for entry. |
| **Trigger** | Browser `onfocus` on `SAIFWebDateTimeEdit`. |
| **Enforcement** | `SAIFWebDateTimeEdit` `SAIFWebDateTimeEdit_Focus` script. |
| **Outcome** | The editor value is set to `null` so the user types into an empty field. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWebDateTimeEdit.vb` |

---

## BR-CTL-013: MinDate and MaxDate are treated as null dates

| Field | Value |
| --- | --- |
| **Statement** | `01/01/1901` (MinDate) and `12/31/9999` (MaxDate) are treated as null dates in the UI. |
| **Trigger** | Browser `onfocus` on `SAIFWebDateTimeEdit`. |
| **Enforcement** | `SAIFWebDateTimeEdit` client script literal comparison. |
| **Outcome** | Sentinel dates are never presented as user-entered data. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWebDateTimeEdit.vb` |

---

## BR-CTL-014: Empty masked field returns an empty string

| Field | Value |
| --- | --- |
| **Statement** | A masked field with no user entry returns an empty string rather than the mask's literal formatting characters. |
| **Trigger** | Read of `PhoneValue` or `TaxIdValue`. |
| **Enforcement** | `SAIFWebMaskEdit` (`RawText.Trim.Length = 0` guard; `StrongTypingException` catch). |
| **Outcome** | Consumers receive an empty value instead of punctuation-only text. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWebMaskEdit.vb` |

---

## BR-CTL-015: Phone value omits trailing extension marker when absent

| Field | Value |
| --- | --- |
| **Statement** | A phone number entered without an extension must not retain the trailing extension marker `x`. |
| **Trigger** | Read of `PhoneValue`. |
| **Enforcement** | `SAIFWebMaskEdit.PhoneValue`. |
| **Outcome** | Stored phone value ends at the last digit. |
| **Source** | `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWebMaskEdit.vb` |

---

## Notes
- Mark inferred statements with `*` and unknown statements with `**`. Do not use bold inline confidence labels.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.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.Infragistics111/clsDropDownController.vb`
- `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWarp.vb`
- `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWebDateTimeEdit.vb`
- `SAIF.Presentation.Web.Controls.Infragistics111/SAIFWebMaskEdit.vb`
