PBToolboxAI v4 ← Site

datagrid — u_pbt_datagrid #

← Komponentenreferenz · Inhalt des Handbuchs

Das moderne Raster eines DataStores: typisierte Spalten und reichhaltige Zellen, Sortierung, Filter, Gruppierung mit Zwischensummen, Bearbeitung an Ort und Stelle, Seitenweise Anzeige, gefensterte Quelle und CSV-Export — das DataWindow bleibt Herr Ihrer Daten.

▶ Live ansehen — Demoanwendung, Kachel Data grid: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.


Auf einen Blick #

Userobjectu_pbt_datagrid
Item-Klassen_pbt_datagrid_column — eine Spalte, erreicht mit of_column
WofürEinen DataStore in einem modernen Raster darstellen — Sortierung, Filter, Gruppierung, Bearbeitung, sehr große Mengen — ohne Ihr DataWindow zu verlassen
Grenze im Demomodus100 angezeigte Zeilen; CSV- und Excel-Export deaktiviert — siehe Der Demomodus

Die Positionierung #

Das datagrid ist kein Ersatz für die DataWindow: Es ist eine Präsentationsschicht, die sich darüberlegt. Sie behalten Ihr SQL, Ihre Retrieve(), Ihre Update(), Ihre Ausdrucke — und gewinnen ein modernes Raster für die Anzeige.

Es zielt auf zwei blinde Flecken des klassischen DataWindow-Rasters:

Die Datenbankanbindung und die Aktualisierung bleiben außerhalb des Umfangs: Sie gehören zur DataWindow.

Der DataStore der Beispiele #

Alle Beispiele dieser Seite — wie die der Demoanwendung — gehen vom selben DataStore mit Kundenkonten aus, eine Zeile pro Konto: city, rep (der Vertriebsmitarbeiter), status, pipeline (ein Prozentsatz), trend (sieben Monatswerte, geschrieben "3,5,2,6,7,4,8"), revenue und rating (eine Note von fünf). Das Raster heißt im Fenster uo_grid, der DataStore ids. Eine mit of_from_datastore geladene Zeile hat ihre RowID im DataStore als Schlüssel: Sie ändert sich nicht, wenn der DataStore sortiert, filtert, einfügt oder löscht. Ein Event gibt sie Ihnen zurück, und ids.GetRowFromRowId(Long(as_key)) ist die Nummer der Zeile, die sie jetzt bezeichnet.

Ein DataStore enthält nur einfache Werte, und das genügt für reichhaltige Zellen: Eine Zahl reicht für eine Anzeige (RENDERER_PROGRESS) und Sterne (RENDERER_RATING), ein Name ergibt einen Avatar, ein Text "3,5,2,6" ein Mini-Diagramm (RENDERER_SPARKLINE) so wie "vip, b2b" Etiketten (RENDERER_TAGS); die Farbe eines Chips (RENDERER_CHIP) wird je Wert mit is_tones vergeben.


Schnellstart #

// open event of the window : the accounts, retrieved the way your application already does
ids = create datastore
ids.dataobject = "d_accounts"
ids.SetTransObject(SQLCA)
ids.Retrieve()

// 1. The grid reads the columns (typed) and every row of the DataStore
uo_grid.of_from_datastore(/*ads*/ ids)

// 2. The titles are the header texts of the DataWindow ; rename one if you like
uo_grid.of_column(/*key*/ "rep").is_title = "Account manager"

// 3. Rich cells : an avatar, a coloured status, a gauge, a mini chart, stars
uo_grid.of_column(/*key*/ "rep").is_renderer = n_pbt_datagrid_column.RENDERER_AVATAR
uo_grid.of_column(/*key*/ "status").is_renderer = n_pbt_datagrid_column.RENDERER_CHIP
uo_grid.of_column(/*key*/ "status").is_tones = "Active=" + n_pbt_datagrid_column.TONE_SUCCESS + "|At risk=" + n_pbt_datagrid_column.TONE_DANGER
uo_grid.of_column(/*key*/ "pipeline").is_renderer = n_pbt_datagrid_column.RENDERER_PROGRESS
uo_grid.of_column(/*key*/ "trend").is_renderer = n_pbt_datagrid_column.RENDERER_SPARKLINE
uo_grid.of_column(/*key*/ "rating").is_renderer = n_pbt_datagrid_column.RENDERER_RATING

// 4. A total, and the city stays in view
uo_grid.of_column(/*key*/ "revenue").is_summary = n_pbt_datagrid_column.SUMMARY_SUM
uo_grid.of_column(/*key*/ "city").is_pin = n_pbt_datagrid_column.PIN_START
// ue_row_clicked event of uo_grid : (string as_key)
// The key of a row loaded by of_from_datastore is its RowID : GetRowFromRowId gives
// the row it designates now, even after a sort or a delete in the DataStore.
wf_open_account(ids.GetRowFromRowId(Long(as_key)))

Eigenschaften #

EigenschaftTypStandardZweck
is_selection_modestringSELECT_NONEAuswahlmodus: keine, eine Zeile, mehrere (Umschalt = Bereich, Strg = Umschalten)
is_densitystringDENSITY_COMFORTABLEZeilenhöhe: komfortabel oder kompakt
is_quick_filterstring""Globaler Schnellfilter: behält nur die Zeilen, deren Text — wie angezeigt (22.09.2026, 1.234,50) oder roh — diesen Wert enthält. Was der Benutzer tippt, wartet das Ende der Eingabe ab; bei einer Fensterquelle ausgeblendet
ib_filter_rowbooleanfalseZeigt die Filtereingabezeile unter den Kopfzeilen an (entspricht der Schaltfläche Filter)
ib_context_menubooleantrueIntegriertes Kontextmenü auf einer Zeile: Kopieren, Alles auswählen, Auswahl aufheben, Als CSV exportieren, dazu Ihre eigenen Einträge (of_add_row_menu_item). Standardmäßig aktiv. Ein Rechtsklick außerhalb der Auswahl verschiebt sie auf die betreffende Zeile, ein Rechtsklick innerhalb behält sie bei. Auf false, um Ihr eigenes Menü aus ue_row_rclicked anzuzeigen
ib_veto_editsbooleanfalseFragt nach, bevor ein eingegebener Wert übernommen wird: löst ue_cell_editing aus, das ablehnen kann — die Zelle behält dann ihren alten Wert
ib_write_backbooleanfalseSchreibt jede Eingabe in den an of_from_datastore übergebenen DataStore — SetItem auf die Zeile, die der Schlüssel bezeichnet (ihre RowID, dort gefunden, wo sie ist), nach dem Typ der Spalte (Datum, Zahl, Text, Codes) — vor ue_cell_edited. Das Update bleibt Ihre Sache; ein geleertes Datum oder eine geleerte Zahl wird NULL, und ein Wert, den der DataStore nicht behalten kann (eine seither gelöschte Zeile, ein von SetItem abgelehnter Wert, ein Text, der keine Uhrzeit ist), wird nicht behalten: Die Zelle nimmt wieder an, was der DataStore hält, ue_write_back_failed sagt warum, und ue_cell_edited wird nicht ausgelöst. SetItem wendet die Validation-Regel der Spalte nicht an: Prüfen Sie einen Wert in ue_cell_editing (ib_veto_edits)
ib_detail_on_demandbooleanfalseDetail auf Abruf: Jede Zeile zeigt ihren Pfeil, und das Öffnen (der Pfeil oder of_expand_row) löst ue_detail_needed aus — füllen Sie dort das Panel mit of_fill_detail, es öffnet sich, wenn das Event zurückkehrt. Nichts gefüllt: Die Zeile bleibt geschlossen. Das Detail von 5.000 Zeilen wird nie im Voraus gelesen
is_group_bystring""Gruppiert die Zeilen nach einer oder mehreren Spalten, in dieser Reihenfolge, ihre Schlüssel durch | verbunden ("status|city"); jeder Gruppenkopf trägt die Zwischensummen der Spalten mit Summe. "" kehrt zur flachen Liste zurück. Live zurückgelesen
ii_page_sizeinteger100Anzahl der Zeilen pro Seite, sobald die Seitennummerierung ausgelöst ist
il_page_thresholdlong50000Zeilenanzahl, ab der das Raster auf Seiten umschaltet. 0 = immer in Seiten aufteilen, unabhängig vom Volumen
is_theme_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Eigenschaften einer Spalte #

Jede Spalte ist ein eigenständiges Objekt, das über of_column("Bezeichner") erhältlich ist — das Handle wird beim ersten Zugriff erzeugt und bleibt danach gültig.

// A column is reached by its key ; used once, it fits on one line
uo_grid.of_column(/*key*/ "amount").is_summary = n_pbt_datagrid_column.SUMMARY_SUM
uo_grid.of_column(/*key*/ "city").is_pin = n_pbt_datagrid_column.PIN_START
EigenschaftTypStandardZweck
is_titlestringder SchlüsselKopftext der Spalte; "" zeigt wieder den Schlüssel. of_from_datastore lässt die Spaltennamen des DataWindows: Benennen Sie sie hier für den Benutzer
is_tonesstring""Farbe eines Chips (RENDERER_CHIP) nach seinem Wert, für den Text eines DataStores: Paare Wert=Ton, verbunden durch | ("Active=success|At risk=danger"), Töne TONE_*; ein nicht aufgeführter Wert bleibt neutral
ii_widthintegerdeklarierte BreiteBreite der Spalte, in Pixeln
ib_hiddenbooleanfalseBlendet die Spalte aus oder wieder ein
is_pinstringPIN_NONEFixiert die Spalte links oder rechts: Sie bleibt beim waagerechten Bildlauf sichtbar
ib_editablebooleanfalseErlaubt die Eingabe: Doppelklick, Eingabe, Enter bestätigt, Esc bricht ab → ue_cell_edited. Ein Wert, der nicht zur Spalte passt (Buchstaben in einer Zahl), wird während der Eingabe als abgelehnt angezeigt, und Enter lässt den Editor offen. Eine boolesche Spalte zeigt ein echtes Kontrollkästchen: ein Klick, Leertaste, Enter oder F2 schaltet es sofort um. Ein auf einer Text- oder Zahlenzelle getipptes Zeichen öffnet den Editor mit diesem Zeichen; während einer Bearbeitung behalten Tab und Umschalt+Tab den Wert und öffnen die nächste (vorherige) bearbeitbare Zelle
is_summarystringSUMMARY_NONESumme am Fuß der Spalte; SUMMARY_NONE entfernt sie. SUMMARY_COUNT zählt die Zellen, die einen Wert haben, wie count() eines DataWindow
is_rendererstringRENDERER_NONENachträglich angewandte Rich-Zelle; RENDERER_NONE kehrt zum Text zurück. RENDERER_BOOL zeigt ein Häkchen für einen wahren Wert; RENDERER_CUSTOM liest den Wert als Rich-Text-Markup — für eine Spalte, die Ihr Code zusammensetzt: Bei einem von einem Benutzer eingegebenen Wert müssen die Klammern maskiert sein ([[ ]])
ii_indexintegerReihenfolge der DeklarationPosition der Spalte (erste Position = 1); eine Spalte, die das Raster nicht hält, liest sich als 0
is_filterstring""Filter je Spalte. Der Text wird in dem gesucht, was die Zelle anzeigt (formatiertes Datum, maskierte Zahl), oder in ihrem Rohwert; bei einer numerischen Spalte wird ein vorangestellter Operator erkannt ("> 1000", "<= 50", "> 1,5" mit dem Dezimaltrennzeichen der Sprache), bei einer Datumsspalte ebenso ("> 22/09/2026", in der Reihenfolge der Sprache, oder ISO). Leere Zeichenkette = Filter entfernt
is_formatstring""Anzeigeformat in der Syntax des DataWindows: "#,##0.00", "$#,##0;($#,##0)", "0.0%", "dd/mm/yyyy", "mmmm d, yyyy", "hh:mm", "@@@-@@@@". Wie in einem DataWindow stehen Komma und Punkt für die Trennzeichen der Sprache. Leere Zeichenkette = das Format des DataWindows gilt wieder; zurücklesbar (das geltende Format)

Konstanten #

Verwenden Sie stets die Konstanten statt literaler Zeichenketten: Die IDE vervollständigt sie, und ein Tippfehler wird unmöglich.

FamilieKonstantenGetragen von
SpaltentypTYPE_STRING, TYPE_NUMBER, TYPE_INT, TYPE_DATE, TYPE_DATETIME, TYPE_BOOLder Komponente (of_add_column)
Rich-ZelleRENDERER_AVATAR, RENDERER_CHIP, RENDERER_PROGRESS, RENDERER_SPARKLINE, RENDERER_RATING, RENDERER_TAGS, RENDERER_BUTTON, RENDERER_LINK, RENDERER_BOOL, RENDERER_CUSTOMder Komponente und dem Spalten-Handle (is_renderer)
Rich-Zelle: keineRENDERER_NONEausschließlich dem Spalten-Handle (is_renderer)
Chip-TonTONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO, TONE_NEUTRALdas Spalten-Handle (is_tones)
AuswahlmodusSELECT_NONE, SELECT_SINGLE, SELECT_MULTIPLEder Komponente (is_selection_mode)
DichteDENSITY_COMFORTABLE, DENSITY_COMPACTder Komponente (is_density)
Summe am FußSUMMARY_NONE, SUMMARY_SUM, SUMMARY_AVG, SUMMARY_MIN, SUMMARY_MAX, SUMMARY_COUNTdem Spalten-Handle (is_summary)
Seite der FixierungPIN_NONE, PIN_START, PIN_END (logisch: START = Kante, an der das Lesen beginnt)dem Spalten-Handle (is_pin)

Konstanten werden auf dem Objekt gelesen, das sie trägt: u_pbt_datagrid.SELECT_MULTIPLE für eine Eigenschaft der Komponente, n_pbt_datagrid_column.PIN_START für eine Spalteneigenschaft.


Methoden #

Das Raster füllen #

MethodeZweck
of_from_datastore (datastore ads)Die DataStore-Brücke: liest die Spalten (Name + PowerBuilder-Typ, automatische Typisierung) und überträgt alle Zeilen in einem einzigen Aufruf, mit dem, was das DataWindow über jede Spalte sagt — ihr Kopftext wird zum Titel, ihr Anzeigeformat gilt, und eine Codetabelle (Values, DropDown DataWindow, CheckBox) zeigt ihren Anzeigewert, während die Zeile den Datenwert behält. Die Spalten kommen in der Reihenfolge, in der das DataWindow sie zeigt (ihr X), und eine im Painter ausgeblendete Spalte (Visible = 0) kommt ausgeblendet an: Der Benutzer blendet sie über die Schaltfläche Spalten wieder ein. Ein berechnetes Feld ist keine Spalte des DataStore: Es kommt nicht mit; ein DropDown DataWindow, dessen Kind keine Zeilen enthält, zeigt die Codes. Rufen Sie sie nach einem Retrieve erneut auf: Die Spalten behalten, was auf ihnen gesetzt wurde (Titel, Rich-Zelle, Fixierung, Breite, Summe) und ihren Platz, was der DataWindow sagt (Kopftext, Format, Codetabelle), wird neu gelesen, und jeder Wert landet unter seiner eigenen Spalte, gleich in welcher Reihenfolge der Benutzer sie angeordnet hat. Der Schlüssel jeder Zeile ist ihre RowID: Sie ändert sich nicht, wenn der DataStore sortiert, filtert, einfügt oder löscht, und ids.GetRowFromRowId(Long(as_key)) ist die Zeile, die sie jetzt bezeichnet. Liefert 0, sobald angewendet, -5, wenn der DataStore ungültig ist oder keine Spalte hat, -2, wenn die Komponente nicht erstellt ist
of_add_column (string as_key, string as_title, string as_type)Fügt eine Spalte mit automatischer Breite nach den anderen hinzu: Die bereits vorhandenen behalten, was auf ihnen gesetzt wurde. Um eine Spalte danach zu ändern, verwenden Sie ihr Handle (of_column). Liefert 0, sobald angewendet, -5, wenn der Schlüssel leer ist, / oder ` enthält oder eine Spalte bezeichnet, die das Raster schon hat, -2`, wenn die Komponente nicht erstellt ist
of_add_column (string as_key, string as_title, string as_type, long al_width)Dasselbe, mit einer Breite in Pixeln (0 = automatisch). Liefert 0, sobald angewendet, -5, wenn der Schlüssel leer ist, / oder ` enthält oder eine Spalte bezeichnet, die das Raster schon hat, -2`, wenn die Komponente nicht erstellt ist
of_add_column (string as_key, string as_title, string as_type, long al_width, string as_renderer)Dasselbe, mit einer Rich-Zelle (RENDERER_*). Liefert 0, sobald angewendet, -5, wenn der Schlüssel leer ist, / oder ` enthält oder eine Spalte bezeichnet, die das Raster schon hat, -2`, wenn die Komponente nicht erstellt ist
of_set_columns (string as_columns_json)Deklariert alle Spalten auf einmal, mit ihren feinen Optionen (Format, Fixierung, bearbeitbare Spalte…). Die zuvor geholten Spalten-Handles (of_column) werden freigegeben: Holen Sie sie neu. Liefert 0, sobald angewendet, -5, wenn der Text kein JSON-Array ist, -2, wenn die Komponente nicht erstellt ist
of_load_rows (string as_rows_json)Ersetzt die angezeigten Zeilen. Der DataStore eines früheren of_from_datastore wird vergessen: ib_write_back und of_reload_row erreichen ihn nicht mehr. Liefert 0, sobald angewendet, -5, wenn der Text kein JSON-Array ist, -2, wenn die Komponente nicht erstellt ist
of_append_rows (string as_rows_json)Fügt Zeilen hinter den bereits angezeigten an — unendlicher Bildlauf, Eintreffen in Echtzeit. Liefert 0, sobald angewendet, -5, wenn der Text kein JSON-Array ist oder Zeilen daraus ausgelassen wurden, weil das Raster ihren Schlüssel schon hält (die anderen werden hinzugefügt), -2, wenn die Komponente nicht erstellt ist
of_update_row (string as_row_json)Ersetzt eine Zeile an Ort und Stelle: die mit demselben Schlüssel _k. Liefert 0, sobald angewendet, -5, wenn der Text kein JSON-Objekt ist oder das Raster keine Zeile mit diesem Schlüssel hält, -2, wenn die Komponente nicht erstellt ist
of_reload_row (long al_row)Sendet eine Zeile des an of_from_datastore übergebenen DataStore erneut, jetzt gelesen: nachdem Ihr Code sie geändert hat. al_row ist ihre heutige Zeilennummer; das Raster findet die Zeile über ihre RowID, eine Sortierung oder Löschung dazwischen ändert nichts. Eine Zeile, die das Raster noch nicht hält (InsertRow, egal wo), wird nach den anderen angefügt. Liefert 0 nach dem Senden, -5, wenn kein DataStore gebunden ist oder die Zeile nicht existiert, -2, wenn die Komponente nicht erstellt ist
of_reset_update ( )Aufzurufen, sobald Ihr Update gelungen ist: Die im Raster bearbeiteten Zellen sind nicht mehr markiert (eine kleine Ecke in der Akzentfarbe). Liefert 0 nach dem Senden, -2, wenn die Komponente nicht erstellt ist
of_remove_row (string as_key)Entfernt eine Zeile anhand ihres Schlüssels. Bei einer Zeile eines DataStore ist der Schlüssel ihre RowID: Holen Sie ihn vor ids.DeleteRow(ll_row) mit String(ids.GetRowIdFromRow(ll_row)). Liefert 0, sobald angewendet, -5, wenn das Raster keine Zeile mit diesem Schlüssel enthält, -2, wenn die Komponente nicht erstellt ist
of_clear_columns ( )Leert die durch of_add_column angesammelten Spalten, bevor ein Raster neu aufgebaut wird. Die zuvor geholten Spalten-Handles (of_column) werden freigegeben: Holen Sie sie neu. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist

Spalten #

MethodeZweck
of_column (string as_key)Das Handle einer Spalte (n_pbt_datagrid_column): Breite, Fixierung, Ausblenden, Eingabe, Summe, Rich-Zelle, Position, Filter — siehe Eigenschaften einer Spalte

Sortierung, Filter, Darstellung #

MethodeZweck
of_sort (string as_col, string as_dir)Sortiert nach einer einzigen Spalte: "asc", "desc" oder "none" (zurück zur geladenen Reihenfolge). Eine Spalte mit Codetabelle sortiert nach ihrem Datenwert, wie ein DataWindow. Mehrere Spalten: of_sort("city A, revenue D"). Liefert 0, sobald sortiert, -5, wenn das Raster diese Spalte nicht hat oder die Richtung keine der drei ist, -2, wenn die Komponente nicht erstellt ist
of_sort (string as_sort)Sortiert nach mehreren Spalten, in ihrer Reihenfolge: Die erste entscheidet, die folgenden entscheiden bei Gleichstand. as_sort wird geschrieben, wie das SetSort eines DataWindows es liest — "city A, revenue D"; asc und desc werden ebenfalls gelesen, eine Spalte ohne Richtung ist aufsteigend, "" hebt die Sortierung auf (geladene Reihenfolge). Liefert 0, sobald sortiert, -5 für eine Spalte, die das Raster nicht hat, eine andere Richtung oder eine zweimal genannte Spalte, -2, wenn die Komponente nicht erstellt ist
of_get_layout ( )Was der Benutzer angeordnet hat, als JSON: die Spalten in ihrer Reihenfolge mit Breite, Fixierung und Sichtbarkeit, die Sortierung (ein geordnetes Array: "sort":[{"col":"city","dir":"asc"},{"col":"revenue","dir":"desc"}]), die Filter wie eingegeben, die Schnellsuche, die Gruppierung und die Filterzeile. Zu speichern (Datei, Registry, Tabelle) und an of_set_layout zurückzugeben. Titel, Rich-Zellen und Formate gehören Ihnen: Sie sind nicht enthalten
of_set_layout (string as_layout_json)Stellt eine mit of_get_layout gelesene oder über ue_layout_changed erhaltene Anordnung wieder her. Eine Spalte, die sie nicht kennt (seither hinzugefügt), behält ihren Platz nach den geordneten; eine genannte, nicht mehr vorhandene Spalte wird ignoriert; ue_layout_changed wird ausgelöst, wie bei jeder Änderung der Anordnung. Eine als einzelnes Objekt geschriebene Sortierung ("sort":{"col":"city","dir":"asc"}) wird ebenfalls gelesen. Liefert 0, sobald angewendet, -5 bei leerem Text oder einem Text, der kein JSON-Objekt ist (eine abgeschnittene Datei: es wird nichts gesendet), -2, wenn die Komponente nicht erstellt ist
of_clear_filters ( )Löscht den Schnellfilter und alle Filter je Spalte. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist

Auswahl, Detail, Export #

MethodeZweck
of_select_rows (string as_keys_json)Setzt die Auswahl aus Ihrem Code, über eine Liste von Schlüsseln ('["1","4"]'); ein leeres Array hebt die gesamte Auswahl auf, ein Schlüssel, den das Raster nicht hält, wird ausgelassen. Wie ein Klick löst es ue_selection_changed aus (nichts, wenn dieselben Zeilen ausgewählt bleiben). Liefert 0, sobald angewendet, -5, wenn der Text kein JSON-Array ist, -2, wenn die Komponente nicht erstellt ist
of_selected_keys ( )Gibt die ausgewählten Schlüssel als JSON-Array ('["1","4"]') zurück, beim Aufruf aus dem Raster gelesen: Eine durch of_select_rows gesetzte Auswahl oder eine seither entfernte Zeile ist bereits berücksichtigt
of_fill_detail (string as_key, string as_markup)Detailbereich einer Zeile, in Rich-Text. Liefert 0, sobald angewendet, -5, wenn das Raster keine Zeile mit diesem Schlüssel enthält, -2, wenn die Komponente nicht erstellt ist
of_expand_row (string as_key) · of_collapse_row (string as_key)Klappt den Detailbereich einer Zeile auf / zu; wie ihr Pfeil löst es ue_row_expanded / ue_row_collapsed aus (nichts, wenn der Bereich schon in diesem Zustand ist). Liefert 0, sobald angewendet, -5, wenn das Raster keine Zeile mit diesem Schlüssel enthält, -2, wenn die Komponente nicht erstellt ist
of_expand_node (string as_key) · of_collapse_node (string as_key)Baummodus: klappt einen Knoten auf / zu (die Kindzeilen tragen _parent). Liefert 0, sobald angewendet, -5, wenn das Raster keine Zeile mit diesem Schlüssel enthält, -2, wenn die Komponente nicht erstellt ist
of_export_csv (string as_path)Schreibt, was das Raster anzeigt (Filter, Sortierung, sichtbare Spalten), in eine CSV-Datei: UTF-8 mit BOM, Semikolon als Trenner — der Zwilling des Crosstab-Exports. Die DLL schreibt die Datei, ue_csv_saved bestätigt. Ohne Lizenz verweigert. Liefert 0, sobald angefordert, -5 bei leerem Pfad, -2, wenn die Komponente nicht erstellt ist
of_export_xlsx (string as_path)Schreibt, was das Raster anzeigt (Filter, Sortierung, sichtbare Spalten), in eine Excel-Arbeitsmappe (.xlsx): Zahlen bleiben Zahlen, mit dem Format ihrer Spalte, die Kopfzeile fett. Die DLL schreibt die Datei, ue_xlsx_saved bestätigt; ein relativer Pfad wird in den Ordner geschrieben, in dem die Anwendung gestartet wurde. Ohne Lizenz und bei einer gefensterten Quelle verweigert. Liefert 0, sobald angefordert, -5 bei leerem Pfad, -2, wenn die Komponente nicht erstellt ist
of_add_row_menu_item (string as_key, string as_label)Fügt einen Ihrer Einträge dem Kontextmenü der Zeile hinzu, unter den integrierten; die Wahl kommt in ue_row_menu_clicked mit diesem Schlüssel zurück, eine leere Beschriftung zeigt den Schlüssel. Liefert 0 nach dem Hinzufügen, -5, wenn der Schlüssel leer ist, / oder `` enthält oder bereits einer Ihrer Einträge ist
of_add_row_menu_separator ( )Ein Trenner zwischen zwei Gruppen Ihrer Einträge. Liefert 0
of_clear_row_menu ( )Entfernt Ihre Einträge: das Zeilenmenü besteht wieder nur aus den integrierten Einträgen. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist

Sehr große Datenmengen #

MethodeZweck
of_open_source (long al_total)Kündigt eine Quelle von al_total Zeilen an, ohne sie zu erzeugen: Das Raster fordert über ue_rows_needed nur die an, die es anzeigen muss. Die Schlüssel sind dann Positionen in Ihrer Quelle; der DataStore eines früheren of_from_datastore wird vergessen. Die Schnellsuche und die Filterzeile sind ausgeblendet (das Raster hält nur die sichtbaren Zeilen); eine vom Benutzer gewählte Sortierung erreicht Sie über ue_sort_changed: Sortieren Sie Ihre Quelle, das Raster fordert seine Zeilen erneut an. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_supply_rows (long al_from, string as_rows_json)Antwort auf ue_rows_needed: Der Zeilenstapel wird ab Zeile al_from gesetzt, ab 1 gezählt wie die Zeilen eines DataStores. Liefert 0, sobald angewendet, -5, wenn der Text kein JSON-Array ist, -2, wenn die Komponente nicht erstellt ist
of_clear_source ( )Verlässt den Fenstermodus und kehrt zu den im Speicher geladenen Zeilen zurück. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_go_to_page (long al_page)Zeigt eine bestimmte Seite an (die erste = 1). Ohne Wirkung, solange die Seitennummerierung nicht ausgelöst ist. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_supply_grand_totals (string as_values_json)Legt die Gesamtsumme fest, die Sie berechnen: '{"ca":128400000,"quantity":51230}'. Eine leere Zeichenkette entfernt sie. Liefert 0, sobald angewendet, -5, wenn der Text kein JSON-Objekt ist, -2, wenn die Komponente nicht erstellt ist

Gemeinsame #

MethodeZweck
of_reset ( )Leert Spalten und Zeilen und versetzt die Komponente in ihren Neuzustand zurück. Liefert 0, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_set_redraw (boolean)Fasst eine Folge von Änderungen zu einer einzigen Darstellung zusammen. Liefert 0
of_save_as_png (string) · of_save_as_jpg (string)Exportiert die Darstellung als Bild. Liefert 0, sobald das Bild geschrieben ist, -2 nicht erstellt, -4 Aufnahme fehlgeschlagen, -5 leerer Pfad

Events #

EventAusgelöst wenn
ue_row_clicked (string as_key)Eine Zeile wird angeklickt
ue_row_dblclicked (string as_key, string as_col)Eine Zeile wird doppelt angeklickt: die Geste, die einen Datensatz öffnet. as_col ist die Spalte unter dem Zeiger. Auf einer bearbeitbaren Zelle öffnet der Doppelklick den Editor und löst dieses Event nicht aus
ue_cell_clicked (string as_key, string as_col)Eine Zelle wird angeklickt
ue_selection_changed (string as_keys_json)Die Auswahl ändert sich: Ein Klick wählt nur diese Zeile, Strg+Klick fügt eine hinzu oder entfernt sie, Umschalt+Klick nimmt einen Bereich, und of_select_rows tut dasselbe aus Ihrem Code; as_keys_json ist das JSON-Array der ausgewählten Schlüssel ('["1","4"]'). Eine Auswahl, die Ihr Code leert (ein Neuladen, SELECT_NONE), wird ebenfalls gemeldet
ue_sort_changed (string as_col, string as_dir, string as_sort)Die Sortierung hat sich geändert: ein Klick auf eine Kopfzeile (Umschalt+Klick fügt der Sortierung eine Spalte hinzu), das Menü einer Spalte oder of_sort — ein Befehl aus dem Code löst das Event aus wie eine Geste; nichts, wenn die Sortierung gleich bleibt. as_col / as_dir: die betroffene Spalte und ihre jetzige Richtung ("none", sobald sie die Sortierung verlassen hat); as_sort: die ganze Sortierung, die Spalten in ihrer Reihenfolge, geschrieben, wie SetSort sie liest ("city A, revenue D", "" für keine). Bei einer gefensterten Quelle (of_open_source) sortieren Sie Ihren DataStore damit — ids.SetSort(as_sort), dann ids.Sort(): Das Raster fordert seine Zeilen danach in der neuen Reihenfolge erneut an
ue_action_clicked (string as_key, string as_col, string as_action)Eine in einer Zelle platzierte Schaltfläche (RENDERER_BUTTON) wird angeklickt
ue_row_expanded (string as_key)Eine Master-Detail-Zeile wird aufgeklappt, über ihren Pfeil oder durch of_expand_row — der richtige Moment, um ihr Detail spontan zu füllen
ue_row_collapsed (string as_key)Eine Master-Detail-Zeile wird zugeklappt, über ihren Pfeil oder durch of_collapse_row
ue_detail_needed (string as_key)Mit ib_detail_on_demand: Eine Zeile, die noch kein Detail hat, wird geöffnet (ihr Pfeil oder of_expand_row). Füllen Sie sie hier mit of_fill_detail(as_key, …): Das Panel öffnet sich, wenn das Event zurückkehrt; nichts gefüllt, die Zeile bleibt geschlossen
ue_filter_changed (string as_filters_json)Der Benutzer hat einen Filter eingegeben, in der Schnellsuche oder in der Filterzeile je Spalte (die Suche: sobald das Tippen aufhört). as_filters_json nennt jeden Filter wie eingegeben und die Suche — {"filters":{"revenue":"> 1000"},"quick":"bos"}: die Texte, die is_filter und is_quick_filter unverändert zurücknehmen
ue_cell_edited (string as_key, string as_col, string as_value)Eine bearbeitbare Zelle wird mit einem neuen Wert bestätigt; as_value ist dieser Wert als Text. Mit ib_veto_edits erst, nachdem ue_cell_editing ihn zugelassen hat. Mit ib_write_back wird ein Wert, den der DataStore ablehnt, nicht behalten: Die Zelle kehrt zurück, ue_write_back_failed sagt warum, und dieses Event wird nicht ausgelöst
ue_cell_editing (string as_key, string as_col, string as_value)Bevor ein eingegebener Wert übernommen wird, nur wenn ib_veto_edits wahr ist. Geben Sie false zurück, um den alten Wert in der Zelle zu lassen (ue_cell_edited wird dann nicht ausgelöst); standardmäßig true
ue_write_back_failed (string as_key, string as_col, string as_value, string as_reason)Mit ib_write_back: Der DataStore konnte einen eingegebenen Wert nicht behalten (seine Zeile seit dem Laden gelöscht, ein von SetItem abgelehnter Wert, ein Text, der keine Uhrzeit ist). Die Zelle hat wieder angenommen, was der DataStore hält, und ue_cell_edited wurde nicht ausgelöst; as_reason sagt warum — dem Benutzer mitteilen oder die Zeile neu laden
ue_layout_changed (string as_layout_json)Die Anordnung hat sich geändert, ob durch den Benutzer oder Ihren Code: eine Spalte in der Größe geändert, verschoben, fixiert oder ausgeblendet, die Sortierung, die Filter, die Schnellsuche, die Gruppierung, die Filterzeile — of_set_layout eingeschlossen. Nichts wird ausgelöst, wenn sich nichts ändert. as_layout_json ist die ganze Anordnung, wie of_get_layout sie liefert: speichern, dann an of_set_layout zurückgeben
ue_rows_needed (long al_from, long al_to)Gefensterter Modus: Das Raster fordert die Zeilen al_from bis al_to an, einschließlich, ab 1 gezählt — die Zeilennummern eines DataStores. Antworten Sie mit of_supply_rows
ue_page_changed (long al_page, long al_pages)Die angezeigte Seite wechselt, über die Schaltflächen der Seitennummerierung oder über of_go_to_page. al_page ist die aktuelle Seite (die erste = 1), al_pages die Gesamtzahl der Seiten. Es informiert nur: Bei einer Fensterquelle werden die Zeilen der neuen Seite über ue_rows_needed angefordert — beantworten Sie dieses, nicht beide
ue_csv_saved (string as_path, boolean ab_ok, string as_error)Die von of_export_csv angeforderte CSV — oder die über den Eintrag Als CSV exportieren des Zeilenmenüs, der den Benutzer nach der Datei fragt — wurde geschrieben oder nicht: ab_ok, und as_error sagt warum
ue_xlsx_saved (string as_path, boolean ab_ok, string as_error)Die von of_export_xlsx angeforderte Arbeitsmappe wurde geschrieben — oder nicht: ab_ok, und as_error sagt warum. as_path ist die geschriebene Datei, ein relativer Pfad aufgelöst
ue_copy (string as_tsv)Der Benutzer hat Strg+C gedrückt. as_tsv enthält die ausgewählten Zeilen samt Kopfzeile oder allein die fokussierte Zelle, wenn nichts ausgewählt ist
ue_row_rclicked (string as_key, string as_col, long al_x, long al_y)Auf eine Zeile wurde rechts geklickt (oder die Menütaste / Umschalt+F10 auf ihr gedrückt). Wird ausgelöst, ob das integrierte Menü aktiv ist oder nicht. al_x / al_y sind Bildschirmpixel, keine PowerBuilder-Einheiten: Um Ihr eigenes Menü dort abzusetzen, wohin der Benutzer gezielt hat, verwenden Sie PopMenu(PointerX(), PointerY()) auf Ihrem Fenster
ue_row_menu_clicked (string as_menu_key, string as_row_key, string as_keys_json)Einer Ihrer Einträge (of_add_row_menu_item) wurde gewählt: as_menu_key ist sein Schlüssel, as_row_key die Zeile, auf der das Menü geöffnet wurde; as_keys_json ist die gesamte Auswahl, auf der eine Stapelaktion arbeiten sollte
ue_ready ( )Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt
ue_runtime_missing ( )Die WebView2-Runtime fehlt: die Komponente bleibt leer
ue_bg_color (long al_color)Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor)

Was der Benutzer ohne eine einzige Codezeile tun kann #

Das Raster bringt seine eigene Symbolleiste und seine Kopfzeilenmenüs mit. Nichts davon verlangt Code von Ihrer Seite:

Jede Änderung der Anordnung kommt in ue_layout_changed zurück: Breiten, Reihenfolge, fixierte oder ausgeblendete Spalten. Bewahren Sie sie auf und geben Sie sie beim nächsten Öffnen mit einem einzigen Aufruf von of_set_layout zurück; of_get_layout liest sie jederzeit.

Über die Tastatur — das Raster ist ein einziger Tabulatorstopp. Einmal erreicht, wird es vollständig über die Tastatur durchlaufen:

TasteWirkung
PfeiltastenVerschieben die fokussierte Zelle, Zelle für Zelle
Pos1 / EndeErste / letzte Spalte der Zeile
Strg+Pos1 / Strg+EndeErste / letzte Zelle des Rasters
Bild auf / Bild abBewegen sich um einen Bildschirm, entsprechend der tatsächlichen Höhe der Ansicht
Umschalt + PfeiltastenErweitern die Auswahl vom Anker aus (Modus SELECT_MULTIPLE)
LeertasteWählt die fokussierte Zeile aus oder ab und setzt den Anker darauf; auf einem bearbeitbaren Kontrollkästchen schaltet sie es um
Eingabe oder F2Versetzt die Zelle in den Bearbeitungsmodus, wenn ihre Spalte bearbeitbar ist; ein Kontrollkästchen wird sofort umgeschaltet
Ein ZeichenÖffnet auf einer bearbeitbaren Text- oder Zahlenzelle den Editor mit diesem Zeichen, wie eine Tabellenkalkulation
Tab / Umschalt+Tab (beim Bearbeiten)Behält den Wert und öffnet die nächste (vorherige) bearbeitbare Zelle, am Zeilenende die nächste Zeile
Strg+CKopiert die Auswahl — siehe ue_copy

Die fokussierte Zelle ist mit der Akzentfarbe umrandet und wird Bildschirmlesern über aria-activedescendant angesagt. Der Fokus überlebt das Scrollen: da das Raster virtualisiert ist, wird er im Speicher gehalten und nach jedem Rendern wieder gesetzt. Er verschwindet hingegen, wenn seine Zeile durch eine Sortierung oder einen Filter aus der Ansicht fällt.

⚠️ Die Zwischenablage des Browsers kann in einer eingebetteten WebView verweigert werden. Deshalb gibt Ihnen ue_copy den Text zurück: legen Sie ihn mit ClipBoard(as_tsv) selbst ab, um des Ergebnisses sicher zu sein.


Beispiele #

Kundenkonten in wenigen Zeilen #

// ids : the accounts DataStore (see above). One repaint for the whole setup.
uo_grid.of_set_redraw(/*on*/ false)

// 1. The grid reads the columns (typed) and every row of the DataStore
uo_grid.of_from_datastore(/*ads*/ ids)

// 2. The titles are the header texts of the DataWindow ; rename one if you like
uo_grid.of_column(/*key*/ "rep").is_title = "Account manager"

// 3. Rich cells : an avatar, a coloured status, a gauge, a mini chart, stars
uo_grid.of_column(/*key*/ "rep").is_renderer = n_pbt_datagrid_column.RENDERER_AVATAR
uo_grid.of_column(/*key*/ "status").is_renderer = n_pbt_datagrid_column.RENDERER_CHIP
uo_grid.of_column(/*key*/ "status").is_tones = "Active=" + n_pbt_datagrid_column.TONE_SUCCESS + "|At risk=" + n_pbt_datagrid_column.TONE_DANGER
uo_grid.of_column(/*key*/ "pipeline").is_renderer = n_pbt_datagrid_column.RENDERER_PROGRESS
uo_grid.of_column(/*key*/ "trend").is_renderer = n_pbt_datagrid_column.RENDERER_SPARKLINE
uo_grid.of_column(/*key*/ "rating").is_renderer = n_pbt_datagrid_column.RENDERER_RATING

// A total, a column that stays in view, several rows selectable
uo_grid.of_column(/*key*/ "revenue").is_summary = n_pbt_datagrid_column.SUMMARY_SUM
uo_grid.of_column(/*key*/ "city").is_pin = n_pbt_datagrid_column.PIN_START
uo_grid.is_selection_mode = u_pbt_datagrid.SELECT_MULTIPLE
uo_grid.of_set_redraw(/*on*/ true)

Nach Status, dann nach Stadt gruppieren #

// The subtotal every group header shows
uo_grid.of_column(/*key*/ "revenue").is_summary = n_pbt_datagrid_column.SUMMARY_SUM

// Two levels : the status, then the city inside it ; "" goes back to a flat list
uo_grid.is_group_by = "status|city"

// The rating stays in view on the right
uo_grid.of_column(/*key*/ "rating").is_pin = n_pbt_datagrid_column.PIN_END

Aus Ihrem Code filtern #

// The filter row under the headers : the user types in it
uo_grid.ib_filter_row = true

// Only the accounts in Paris, and only those above one million
uo_grid.is_quick_filter = "Paris"
uo_grid.of_column(/*key*/ "revenue").is_filter = "> 1000000"

Nach mehreren Spalten sortieren #

Die Sortierung wird geschrieben wie die eines DataWindows: Die erste Spalte entscheidet, die folgenden bei Gleichstand. Der Benutzer tut dasselbe mit der Maus per Umschalt+Klick auf die Kopfzeilen; ein einfacher Klick beginnt wieder mit einer einzigen Spalte.

// City first, then the largest revenue in each city
uo_grid.of_sort(/*sort*/ "city A, revenue D")

Was das Raster im DataWindow liest #

of_from_datastore übernimmt mehr als die Daten: Der Kopftext jeder Spalte (<spalte>_t) wird zu ihrem Titel, ihr Anzeigeformat (Format oder die Maske eines EditMask) gilt, und eine Codetabelle — die Values eines Edit, einer DDLB oder von Optionsfeldern, ein DropDown DataWindow, eine CheckBox — zeigt den Anzeigewert (Active), während die Zeile den Datenwert (A) behält. Sortiert und gesucht wird nach dem Sichtbaren; eine Spalte mit Codetabelle wird über eine Liste bearbeitet, und der Datenwert kommt zurück.

// The grid reads titles, formats and code tables in the DataWindow
uo_grid.of_from_datastore(/*ads*/ ids)

// A format of your own on one column, in the DataWindow's syntax
uo_grid.of_column(/*key*/ "revenue").is_format = "$#,##0.00;($#,##0.00)"

// The rating is picked in its code table (Poor to Excellent) ; the number goes into the DataStore
uo_grid.of_column(/*key*/ "rating").ib_editable = true
uo_grid.ib_write_back = true

// Your code changed a row of the DataStore : show it again
ids.SetItem(12, "rating", 5)
uo_grid.of_reload_row(/*row*/ 12)

An Ort und Stelle bearbeiten, im DataStore speichern #

Das Raster bearbeitet, der DataStore bewahrt die Wahrheit: Mit ib_write_back wird jede Eingabe in die Zeile geschrieben, die der Schlüssel bezeichnet (ihre RowID, dort gefunden, wo sie ist), nach dem Typ der Spalte, vor ue_cell_edited — und die Anzeige folgt. Eine bearbeitete Zelle behält eine kleine Ecke in der Akzentfarbe bis of_reset_update.

// The pipelines can be edited : double-click, type a percentage, Enter
uo_grid.of_column(/*key*/ "pipeline").ib_editable = true

// Every edit goes into the DataStore itself, on the row the key designates
uo_grid.ib_write_back = true

Eine bearbeitbar gemachte boolesche Spalte (TYPE_BOOL oder eine CheckBox-Spalte eines DataWindows, gelesen von of_from_datastore) zeigt in jeder Zelle ein echtes Kontrollkästchen: Ein Klick, Leertaste, Enter oder F2 schaltet es sofort um — kein Texteditor, und ein Doppelklick schaltet es nicht zweimal um. Die Zelle erhält den Wert des anderen Zustands — true/false oder die ON/OFF-Werte der CheckBox des DataWindows — auf demselben Weg wie eine Eingabe: Veto ib_veto_edits / ue_cell_editing, dann ue_cell_edited, Markierung „geändert“ und ib_write_back. Schreibgeschützt behält eine boolesche Spalte ihr Häkchen ✓.

// A yes/no column the user ticks : a check box in every cell
uo_grid.of_add_column(/*key*/ "vip", /*title*/ "VIP", /*type*/ u_pbt_datagrid.TYPE_BOOL)
uo_grid.of_column(/*key*/ "vip").ib_editable = true
// Saving stays with the DataStore : when the user confirms
if ids.Update() = 1 then
	COMMIT USING SQLCA;

	// the edited cells are no longer marked as modified
	uo_grid.of_reset_update()
else
	ROLLBACK USING SQLCA;
end if

Eine aufklappbare Zeile, aus dem DataStore geschrieben #

// Local variables
long ll_row

// A detail panel for the first 20 accounts, written from their DataStore row
for ll_row = 1 to 20
    uo_grid.of_fill_detail(/*key*/ String(ll_row), /*markup*/ "[b]" + ids.GetItemString(ll_row, "rep") + "[/b] follows the " + ids.GetItemString(ll_row, "city") + " account")
next

// The first one is open right away ; the chevron opens the others
uo_grid.of_expand_row(/*key*/ "1")

Seiten statt Bildlauf, und die Summe von allem #

Sobald es blättert, hält das Raster nur eine Seite: Seine Fußzeile summiert die Seite. Die Summe aller Konten hat der DataStore.

// Local variables
n_pbt_json lnv_totals
double ld_revenue
long ll_row

// Pages of 25 rows past 100 rows ; the footer totals the page
uo_grid.ii_page_size = 25
uo_grid.il_page_threshold = 100
uo_grid.of_column(/*key*/ "revenue").is_summary = n_pbt_datagrid_column.SUMMARY_SUM

// The grand total of ALL the accounts, from the DataStore
for ll_row = 1 to ids.RowCount()
    ld_revenue = ld_revenue + ids.GetItemDecimal(ll_row, "revenue")
next
lnv_totals.of_set_number(/*path*/ "revenue", /*value*/ ld_revenue)
uo_grid.of_supply_grand_totals(/*values_json*/ lnv_totals.of_text())

Eine Quelle, die das Raster nie ganz hält #

Bei Hunderttausenden von Zeilen erfährt das Raster nur deren Anzahl und fordert die an, die es anzeigt. Hier liest Ihre Anwendung den angeforderten Ausschnitt aus der Datenbank; die Zeilennummern beginnen bei 1, wie die des DataStores.

// The grid only learns HOW MANY rows exist ; it asks for the ones on screen
uo_grid.of_open_source(/*total*/ ids.RowCount())
// ue_rows_needed event of uo_grid : (long al_from, long al_to)
// Rows al_from to al_to, both included, counted from 1 like the DataStore
n_pbt_json lnv_row
string ls_rows
long ll_row

// One JSON row per DataStore row asked for, its key being the row number
ls_rows = "["
for ll_row = al_from to Min(al_to, ids.RowCount())
    lnv_row.of_clear()
    lnv_row.of_set_string(/*path*/ "_k", /*value*/ String(ll_row))
    lnv_row.of_set_string(/*path*/ "city", /*value*/ ids.GetItemString(ll_row, "city"))
    lnv_row.of_set_string(/*path*/ "rep", /*value*/ ids.GetItemString(ll_row, "rep"))
    lnv_row.of_set_string(/*path*/ "trend", /*value*/ ids.GetItemString(ll_row, "trend"))
    lnv_row.of_set_number(/*path*/ "revenue", /*value*/ Double(ids.GetItemDecimal(ll_row, "revenue")))
    if ll_row > al_from then ls_rows = ls_rows + ","
    ls_rows = ls_rows + lnv_row.of_text()
next
uo_grid.of_supply_rows(/*from*/ al_from, /*rows_json*/ ls_rows + "]")
// ue_sort_changed event of uo_grid : (string as_col, string as_dir, string as_sort)
// as_sort is the whole sort, written as SetSort reads it ("" for none) :
// sort the source with it, the grid then asks for its rows again
ids.SetSort(as_sort)
ids.Sort()

Exportieren, was angezeigt wird #

// What is shown - filters, sort, visible columns - to a CSV file
uo_grid.of_export_csv(/*path*/ "C:\exports\accounts.csv")
// ue_csv_saved event of uo_grid : (string as_path, boolean ab_ok, string as_error)
if ab_ok then
    st_status.Text = "Written : " + as_path
else
    st_status.Text = as_error
end if

Ihre eigenen Einträge im Zeilenmenü #

// The row menu, entry by entry
uo_grid.of_add_row_menu_item(/*key*/ "open", /*label*/ "Open the account")
uo_grid.of_add_row_menu_separator()
uo_grid.of_add_row_menu_item(/*key*/ "call", /*label*/ "Call the sales rep")
// ue_row_menu_clicked event of uo_grid : (string as_menu_key, string as_row_key, string as_keys_json)
choose case as_menu_key
    case "open"
        wf_open_account(Long(as_row_key))
    case "call"
        wf_call(ids.GetItemString(Long(as_row_key), "rep"))
end choose

Auf die Auswahl reagieren #

// ue_selection_changed event of uo_grid : (string as_keys_json)
// '["3","7"]' : the RowIDs of the selected accounts (ids.GetRowFromRowId gives their rows)
cb_delete.Enabled = (Pos(as_keys_json, "[]") = 0)

Die Anordnung des Benutzers merken #

// ue_layout_changed event of uo_grid : (string as_layout_json)
// Order, widths, pins, hidden columns, sort, filters, grouping : keep it
SetProfileString(gs_ini, "grids", "accounts", as_layout_json)
// open event of the window, once the grid is filled : the layout of last time
uo_grid.of_set_layout(/*layout_json*/ ProfileString(gs_ini, "grids", "accounts", ""))

Best Practices #

Vom gemeinsamen Sockel geerbt #

Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.

MitgliederRolleBeschrieben in
of_count · of_keys_at · of_hasDurchlaufen, was die Komponente enthält3.2 Die Items
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine

Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.

← Komponentenreferenz · Inhalt des Handbuchs