DataGrid: Selection
Zeilen auswählen, einzeln oder mehrfach: Maus- und Tastaturbedienung, stabile Zeilenschlüssel und die JavaScript-Schnittstelle für den aufrufenden Code.
Das DataGrid kennt zwei Arten von Auswahl: eine aktive Zeile, der eine Vorschau folgt, und mehrere angehakte Zeilen, die ein Massenbefehl trifft. Beide sind mit Maus und Tastatur bedienbar, die Mehrfachauswahl auch ohne JavaScript.
Zurück: Demo-Übersicht
1. Übersicht und Zweck
Status: [Live]. Referenzen: Fluent UI
DetailsList (SelectionMode.multiple), Azure-DevOps-Backlog-Bulk-Edit
(Auswahl-Toolbar), DevExpress-Grid-Checkbox-Selection, VS-Code-Listen
(Ctrl/Shift-Modell).
Vertieft den selection/rowKey-Teil des
dataGrid()-Basiskontrakts:
Einzel- und Mehrfachauswahl von Zeilen, Maus-/Tastaturbedienung, JS-API für
Konsumenten.
2. Voraussetzungen
- dataGrid()-Grundkontrakt bereits verstanden.
- Bei
multi: jede Zeile braucht einen Spalten-Wert, der sie eindeutig identifiziert (fürrowKey).
3. Konzepte
Aktive Zeile und Auswahl sind zwei Dinge. Die aktive Zeile ist die, um die
es gerade geht – sie treibt eine Vorschau in der Detailspalte. Die Auswahl sind
die angehakten Zeilen – sie tragen den Massenbefehl. Im Modus multi
bestehen beide nebeneinander: drei Zeilen angehakt, eine vierte in der
Detailspalte offen. Fluent UI DetailsList trennt dieselben zwei Begriffe.
Die aktive Zeile trägt aria-current=„true“, eine ausgewählte
aria-selected=„true“. Pfeiltasten bewegen die aktive Zeile,
Leertaste/Klick ändert die Auswahl.
Auswahlzustand ist ansichts-lokal: Filter-, Sortier- oder Seitenwechsel verwirft die Auswahl (bewusst – keine unsichtbar mitlaufende Auswahl über Ansichten hinweg).
4. Erste Schritte
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'single', ]);
Falsch: rowKey auf eine Spalte zeigen lassen, deren Wert nicht
eindeutig ist (z. B. status). Mehrere Zeilen posten dann denselben
selection[]-Wert – der Server kann sie serverseitig nicht
unterscheiden.
5. Verwendung
| Einsatz | Muster |
|---|---|
| Detailansicht der aktiven Zeile (Auxbar, Eigenschaften-Panel) | wk-selectionchange-Event, Feld active – in single wie in multi |
| Massenaktionen auf mehreren Zeilen | selection => 'multi' + rowKey + bulkActions |
| Beides zugleich: Vorschau folgt einer Zeile, Massenbefehl trifft mehrere | selection => 'multi' – der Ergebnisraster von SQLite Data Studio arbeitet so |
6. API-Referenz
$opts['selection'] | Verhalten |
|---|---|
none (Default) | Keine Auswahl-UI |
single | Eine aktive Zeile, die zugleich die ausgewählte ist; 'selectable' => true bleibt als Alias gültig |
multi | Checkbox-Spalte + Auswahl-Toolbar, dazu eine davon unabhängige aktive Zeile; erfordert $opts['rowKey'] |
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', ]);
7. Parameter, Optionen und Zustände
| Schlüssel | Typ | Bedeutung |
|---|---|---|
$opts['selection'] | 'none'|'single'|'multi' | Auswahlmodell, s. Abschnitt 6 |
$opts['selectable'] | bool | Alias für selection => 'single' |
$opts['rowKey'] | string | Spalten-Key, der eine Zeile eindeutig identifiziert – Pflicht bei multi |
$opts['selectionName'] | string | Feldname der Auswahl auf der Leitung, Default selection (postet als selection[]) |
$opts['selectionForm'] | string | id des Formulars, mit dem die Auswahl abgeschickt wird – für Bildschirme, deren Gegenstelle bereits existiert |
Einzelauswahl (single)
Klick/Pfeiltasten markieren die aktive Zeile (aria-selected,
--wk-admin-row-selected-bg); Strg+C kopiert sie
(data-wk-copy der Zeile gewinnt, sonst der Tab-verbundene Zelltext –
s. Data Export).
Mehrfachauswahl (multi)
- Checkbox-Spalte: erste Spalte mit echten
<input type="checkbox" name="selection[]" value="<rowKey>">-Zellen plus Kopf-Checkbox („alle sichtbaren Zeilen an-/abwählen“, indeterminate bei Teilauswahl). Die Checkboxen liegen in einem umschließenden<form>– die Auswahl funktioniert dadurch vollständig ohne JavaScript (Formular-POST vonselection[]). - Aktive Zeile: Klick oder Pfeiltaste setzt sie, ohne etwas anzuhaken. Sie trägt
aria-current=„true“und eine Markierung am Zeilenanfang; eine Detailspalte folgt ihr (s.activein der Selection-API). Die Haken bleiben davon unberührt. - Maus: Klick auf die Checkbox togglet;
Strg+Klickauf die Zeile togglet ebenfalls;Shift+Klickwählt den Bereich von der zuletzt aktiven bis zur geklickten Zeile. - Tastatur: Pfeiltasten bewegen die aktive Zeile,
Leertastetogglet sie,Shift+Pfeilerweitert den Bereich,Strg+Awählt alle sichtbaren Zeilen,Strg+Ckopiert alle gewählten Zeilen (zeilenweise, je Zeile gewinnt derendata-wk-copy-Attribut – s. Data Export). Der Container trägtaria-multiselectable=„true“, Zeilenaria-selected.
Selection-API (JavaScript)
wkDataGrid.getSelection(gridEl)→ Array derrowKey-Werte der aktuell gewählten Zeilen.- Bei jeder Änderung feuert das Grid ein bubbelndes
CustomEventwk-selectionchangemitdetail = { keys: string[], count: number, active: string|null }. keys/countnennen die angehakten Zeilen,activedie aktive. Wer eine Vorschau führt, liestactive; wer einen Massenbefehl führt, liestkeys. Insingleist beides dieselbe Zeile.
document.querySelector('.wk-datagrid').addEventListener('wk-selectionchange', (ev) => { console.log(ev.detail.count, 'Zeilen ausgewählt:', ev.detail.keys); console.log('Vorschau zeigt:', ev.detail.active); });
Fehlerverhalten
| Bedingung | Verhalten |
|---|---|
selection => 'multi' ohne rowKey | stille Degradierung auf none – kein Fehler |
rowKey zeigt auf nicht-eindeutige Spalte | keine Prüfung durch das Widget – mehrere Zeilen posten denselben Wert, der Server muss das erkennen (s. Abschnitt 4, „Falsch“) |
8. Vollständige Beispiele
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', ]);
Vorschau und Massenbefehl nebeneinander, mit den Feldnamen einer bestehenden Gegenstelle:
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', 'selectionName' => 'sel', 'selectionForm' => 'wkq-bf', ]);
9. Einschränkungen und Randfälle
- Die Auswahl gilt je Ansicht: Filter-, Sortier- oder Seitenwechsel verwirft sie (bewusst, s. Abschnitt 3).
- Kein „Auswahl über mehrere Seiten hinweg merken“ – jede neue Ansicht startet mit leerer Auswahl.
- Die aktive Zeile überlebt einen Seitenwechsel ebenfalls nicht. Ein Bildschirm, der sie behalten muss, trägt sie in der Adresse mit und setzt sie beim Zeichnen (
data-wk-current="1"an der Zeile).
10. Accessibility und Kompatibilität
- Vollständiger Überblick: Accessibility (konsolidiert, nicht hier dupliziert).
- Ohne JavaScript bleibt
multivollständig nutzbar (Formular-POST);singleerfordert für die Klick-Markierung JavaScript, native Tab-Navigation bleibt aber immer erhalten. - Ohne JavaScript gibt es keine aktive Zeile. Ein Bildschirm, der eine Vorschau anbietet, hält dafür einen Verweis je Zeile bereit – er setzt den Schlüssel in die Adresse, und der Server zeichnet die Vorschau.
11. Troubleshooting
Symptom: Checkbox-Spalte fehlt trotz selection => 'multi'.
Ursache: rowKey fehlt in $opts – das Widget degradiert still auf
none.
Lösung: $opts['rowKey'] auf einen eindeutigen Spalten-Key
setzen.
Symptom: Die Detailspalte bleibt beim zweiten Haken stehen.
Ursache: Der Zuhörer liest keys und verlangt genau einen Eintrag.
Lösung: active lesen. Es nennt die Zeile, um die es geht – unabhängig
davon, wie viele angehakt sind.
12. Verwandte Themen
- Demo-Übersicht – alle Kategorien
- DataGrid: Data Editing (Massenaktionen) – Auswahl-Toolbar, Bulk-Operationen auf der Selection
- FluentUI: Vertical Grid (Property Grid) – Demo-Übersicht – Eigenschaften-Inspector, der auf
wk-selectionchangereagieren kann - DataGrid: Accessibility – ARIA-/Tastatur-Gesamtüberblick