---
title: SAIF.Presentation.Web.Binding.Infragistics103 business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF documentation team
last_reviewed: 2026-08-17
library: SAIF.Presentation.Web.Binding.Infragistics103
reference_type: embedded
---

# SAIF.Presentation.Web.Binding.Infragistics103 business rules

This library does not define or enforce domain/business rules of its own; it is a UI-binding mechanism that surfaces rule violations computed elsewhere (in `SAIF.BOF.Framework` business objects via `IDataErrorInfo`/`IsValid`). The rules below are internal **binding/formatting behaviors** enforced in code, documented here as rule-like constraints since they govern conditional application behavior.

## BR-BIND-001: Error CSS suppression for protected fields

| Field | Value |
| --- | --- |
| **Statement** | `SetControlFormat` does not overwrite a control's CSS to an error state if the control's current `CssClass` is `"disabledbackcolor"`. |
| **Trigger** | `Validate()`/`RefreshValidation()` calling `SetControlFormat(False)` on a binder whose control is in error. |
| **Enforcement** | `clsObjectBinderBase.SetControlFormat` checks `m_Control.CssClass <> "disabledbackcolor"` before applying valid-state CSS; the error branch is unconditional for non-disabled controls. |
| **Outcome** | A control marked disabled/protected in the UI is never visually flagged as valid/invalid by the binder. |
| **Source** | `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBinderbase.vb` |

---

## BR-BIND-002: Grid/list controls exempt from cell-level error/valid CSS

| Field | Value |
| --- | --- |
| **Statement** | Controls whose type name (case-insensitive) contains `"ULTRAWEBGRID"`, `"WEBDATAGRID"`, or `"CHECKBOXLIST"` are skipped by the generic CSS error/valid formatting logic. |
| **Trigger** | `SetControlFormat` invoked (valid or error branch) for a binder bound to a grid or checkbox-list control. |
| **Enforcement** | `clsObjectBinderBase.SetControlFormat` checks `m_Control.GetType.Name.ToUpper.IndexOf("ULTRAWEBGRID")`, `.IndexOf("WEBDATAGRID")`, and `.IndexOf("CHECKBOXLIST")` and no-ops the CSS assignment when any of the three substrings is found. |
| **Outcome** | Grid and checkbox-list controls never receive the generic single-control error/valid `CssClass` styling; any error indication for these controls must come from other mechanisms (e.g., row/column error tracking in `clsUltraGridBinder`). |
| **Source** | `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBinderbase.vb` |

---

## BR-BIND-003: Multi-line TextBox error styling differs from single-line

| Field | Value |
| --- | --- |
| **Statement** | For a `TextBox` in `MultiLine` mode, the error state applies `errorbordercolor`; for a single-line `TextBox` (and other controls), the error state applies `errorbackcolor`. |
| **Trigger** | `SetControlFormat(False)` invoked for a binder whose control's type name contains `"TEXTBOX"`. |
| **Enforcement** | `clsObjectBinderBase.SetControlFormat` casts the control to `WebControls.TextBox` and branches on `TextMode = WebControls.TextBoxMode.MultiLine`. |
| **Outcome** | Multi-line text areas are visually flagged with a border-color change rather than a background-color change when in error. |
| **Source** | `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBinderbase.vb` |

---

## BR-BIND-004: First-error-control precedence during formatting

| Field | Value |
| --- | --- |
| **Statement** | During `Validate()`/`RefreshValidation()`, once `m_FirstErrorControl` is set, subsequent non-error binders whose control matches that same control are not re-formatted as valid. |
| **Trigger** | Iteration of `m_Bindings` in `Validate()`/`RefreshValidation()` reaching a binder with no errors after an earlier binder (same control) recorded the first error. |
| **Enforcement** | `clsObjectBindManager.Validate`/`RefreshValidation` compares the current binder's control against `m_FirstErrorControl` before calling `SetControlFormat(True)`, skipping the call on a match. |
| **Outcome** | Prevents a later "no error" formatting pass from erasing the visual error indicator applied by the earlier error pass on the same control. |
| **Source** | `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBindManager.vb` |

---

## BR-BIND-005: Duplicate error-message suppression

| Field | Value |
| --- | --- |
| **Statement** | Identical error text strings are added to the manager's aggregate error collection only once. |
| **Trigger** | `Validate()`/`RefreshValidation()` collecting error messages from multiple binders. |
| **Enforcement** | `clsObjectBindManager.Validate` guards each add with `If Not m_Errors.Contains(ErrorText)`. |
| **Outcome** | Avoids repeated display of the same message when multiple binders are bound to the same underlying error (e.g., the same business-object property bound to two controls). |
| **Source** | `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBindManager.vb` |

---

## BR-BIND-006: Validation key derivation for SAIF framework objects

| Field | Value |
| --- | --- |
| **Statement** | For objects recognized as SAIF framework objects (`clsBusinessBase`/`clsBusinessCollectionBase` present in the CLR base-type chain), the validation dictionary key is the object's `MyGuid` property value; for all other objects, the key is the CLR type name uppercased. |
| **Trigger** | `AddBinder()` computing `binder.ValidationKey` when a binder is registered. |
| **Enforcement** | `clsObjectBinderBase.ValidationKey` calls `IsSAIFFrameWorkObject` and, if true, reads `MyGuid` via `GetObjectValueAsString`; otherwise falls back to `ValidationObject.GetType.Name.ToUpper`. |
| **Outcome** | Determines the key used to track distinct bound objects in `clsObjectBindManager.m_ValidationObjects` for re-validation (`ValidateBindSources`). |
| **Source** | `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBinderbase.vb` |

## Notes
- This library does not itself evaluate business rules; rule outcomes originate in bound `SAIF.BOF.Framework` business objects and are only surfaced (as CSS formatting and error text) here.
- The re-registration behavior of `Update(UltraWebGrid, IEnumerable)`, `Update(WebDataGrid, IEnumerable)`, and `Update(DropDownList, Object)` (append rather than replace in `m_Bindings`) is documented as an architectural risk in [Architecture](architecture.md) and [Dependencies](dependencies.md), not as a formal business rule, since it was not confirmed as an intentional design choice.*

> **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.

## 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)

## Sources
- `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBinderbase.vb`
- `SAIF.Presentation.Web.Binding.Infragistics103\clsObjectBindManager.vb`
