← Back to Home • Next: TableMultiSelect — Styles →
How the TableMultiSelect<T> control behaves while it is running: keyboard, checkboxes, ranges, filtering,
horizontal scrolling, paging, history, and view-only mode.
Select products: Notebook Pro ← prompt + live answer (follows the cursor + column)
Category: Electronics ← description (optional / dynamic)
+---------------------------------------+
| | Id | Name | Price | ← header row
+---+------+---------------+------------+
| x | 1 | Notebook Pro | $ 1299.99 | ← focused, checked row
| | 2 | Wireless Mouse| $ 29.90 | ← unchecked row
+---------------------------------------+
Filter: note ← live filter text (when filtering)
Page 1/2 ← pagination
Space: check Enter: confirm Esc: cancel ← tooltip
The answer line updates as you navigate: without a TextSelector it
shows the value of the row under the cursor in whichever column is currently Tab-focused (Tab/
Shift+Tab change it); with a TextSelector, that fixed text is shown instead, regardless of
column. Once confirmed (Enter), the final answer shown is the checked-rows summary
(comma-joined), resolved the same way per row.
Every region can be recolored — see Styles.
| Key | Action |
|---|---|
↑ / ↓ |
Move focus up / down (rows) |
Page Up / Page Down |
Jump one page |
Ctrl+Home / Ctrl+End |
First / last row |
Space |
Toggle the checkbox on the focused row |
Tab / Shift+Tab |
Move the focused column; wraps around at the first/last column |
Enter |
Confirm the checked set (enforces Range) |
Esc |
Abort → IsAborted == true |
| Any printable character | Type to filter (when Filter is not Disabled) |
Backspace |
Edit the filter text |
F2 |
Toggle all rows on / off (respects the check predicate) |
F3 |
Show only the checked rows / restore the full list |
F1 |
Cycle tooltip content |
Ctrl+F1 |
Show / hide the tooltip |
Disabled rows are skipped and cannot be toggled.
The exact physical keys for toggle-all / filter-selected are configurable — the tooltip line always shows the active bindings. See Keyboard Bindings.
AddItem / AddItems can start rows checked with
ischecked: true.Default(values) pre-checks matching rows; its values take precedence over the
per-item ischecked flag.Range(min, max?) is enforced on Enter:
min rows are checked, the control stays open with a “minimum” error.max rows are checked, it stays open with a “maximum” error.max of null means unlimited.AddColumn is header-first: header text, then a Func<T, object> selector,
then optional formatter, width, alignment, and filterable flag.width: n) or auto-sized from the header and all cell values at Run time.ColumnAlignment sets per-column horizontal alignment:
| Value | Effect |
|---|---|
Left |
Align cell content to the left (default) |
Right |
Align cell content to the right (typical for numbers) |
Center |
Center cell content |
Tab / Shift+Tab always move the focused column, wrapping around at the first/last column — this
works even when every column already fits on screen and nothing needs to scroll.
HorizontalScroll only changes what happens once scrolling is
actually needed (the columns don’t all fit within the console width):
Full (default) — shifts the visible viewport as a full column window.Column — focuses one column at a time.LayoutMode picks the box-drawing character set: SingleBox (default),
DoubleBox, SingleASCII, DoubleASCII, or None.HideElements hides individual regions — RowSeparator, Header,
ColumnSeparator, OuterBorder — and combines with |. HideTable.None (default) shows everything.When Filter is Contains or StartsWith, typing narrows the visible rows in real time:
FilterTableMode.Answer matches against the answer text (TextSelector).FilterTableMode.ColumnFilters matches against the concatenated text of every column declared with
isFilterable: true.Disabled (the default) turns typing off entirely — arrow keys only.
Default(values) pre-checks rows; provide
DefaultMatchBy for records/classes so the right rows are located.EnableHistory, the checked array is stored on disk as JSON;
UseDefaultHistory restores it on the next run.MinPrefixLength, MaxItems, ExpirationTime, FilterType, PageSize) match the
Input history options.ViewOnly() renders the table for display only:
Default remain shown as checked (read-only).Set per instance via Options(...), or globally on
PromptPlus.Config:
| Option | Effect on TableMultiSelect<T> |
|---|---|
EnabledAbortKey(false) |
Removes Esc — the user must confirm |
HideAfterFinish(true) |
Erases the table after confirm — the whole control is erased, not just the interactive part |
ShowTooltip(false) |
Hides the keyboard hint line |
Prompt(...) / Description(...) |
Overrides the prompt / description text |
PageSize can be set per control (PageSize) or globally (PromptPlus.Config.PageSize).
Run throws ValidationException unless at least one column and one
row have been added..Content.Length == 0), not null — this is distinct
from an aborted result. Branch on IsAborted first..Value wrapper. Iterating .Content yields each T directly, unlike
Table<T> which returns a single TableSelectResult<T>.DefaultMatchBy, Default on a
record/class may not match the intended rows.Options