Farbschema: Dunkel
Sie befinden sich hier: start » de » Dokumentation » DokuWiki-Erweiterungen (WvdS) » FluentUI (Design-System-Bibliothek) » FluentUI: Komponenten-Referenzen » FluentUI: Desktop-DataGrid – Demo-Übersicht » DataGrid: Selection

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ür rowKey).

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 von selection[]).
  • 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. active in der Selection-API). Die Haken bleiben davon unberührt.
  • Maus: Klick auf die Checkbox togglet; Strg+Klick auf die Zeile togglet ebenfalls; Shift+Klick wählt den Bereich von der zuletzt aktiven bis zur geklickten Zeile.
  • Tastatur: Pfeiltasten bewegen die aktive Zeile, Leertaste togglet sie, Shift+Pfeil erweitert den Bereich, Strg+A wählt alle sichtbaren Zeilen, Strg+C kopiert alle gewählten Zeilen (zeilenweise, je Zeile gewinnt deren data-wk-copy-Attribut – s. Data Export). Der Container trägt aria-multiselectable=„true“, Zeilen aria-selected.

Selection-API (JavaScript)

  • wkDataGrid.getSelection(gridEl) → Array der rowKey-Werte der aktuell gewählten Zeilen.
  • Bei jeder Änderung feuert das Grid ein bubbelndes CustomEvent wk-selectionchange mit detail = { keys: string[], count: number, active: string|null }.
  • keys/count nennen die angehakten Zeilen, active die aktive. Wer eine Vorschau führt, liest active; wer einen Massenbefehl führt, liest keys. In single ist 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 multi vollständig nutzbar (Formular-POST); single erfordert 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

de/wiki/dwe/wkfluentui/component/datagrid/selection.txt · Zuletzt geändert: von 127.0.0.1