Datenquellen
Erstellen einer Datenquelle (Custom List)
Eine Klasse, die von Peakboard.ExtensionKit.CustomListBase erbt, repräsentiert eine einzelne Datenquelle – intern Custom List genannt. Sie definiert die konfigurierbaren Eingaben, die Ausgabespalten und die Logik zum Abruf der Datenzeilen.
Wichtig
Jede Klasse, die von CustomListBase erbt, muss mit dem Attribut [Serializable] versehen sein. Das ist für die korrekte Serialisierung und Kompatibilität innerhalb von Peakboard erforderlich.
using Peakboard.ExtensionKit;
namespace HubSpot;
[Serializable]
internal class HubSpotCustomList : CustomListBase
{
// Overrides (siehe unten)
}
Metadaten und Benutzereingaben: GetDefinitionOverride
GetDefinitionOverride liefert eine CustomListDefinition mit den Metadaten der Datenquelle. Die Collection PropertyInputDefaults repräsentiert die Einstellungen, die der Endbenutzer im Peakboard Designer vornimmt:
protected override CustomListDefinition GetDefinitionOverride()
{
return new CustomListDefinition
{
ID = "CatFactsCustomList",
Name = "Cat Facts",
Description = "Random cute stuff about cats",
PropertyInputPossible = true,
PropertyInputDefaults =
{
new CustomListPropertyDefinition() { Name = "MaxLength", Value = "140" },
new CustomListPropertyDefinition() { Name = "Token", Value = "Enter your API token here", Masked = true }
}
};
}
Die hier definierten Properties erscheinen als Eingabefelder im Designer:

Eine Property (CustomListPropertyDefinition) kann die folgenden Attribute haben:
| Attribut | Beschreibung |
|---|---|
Name |
Der Name der Property. |
Value |
Der Standardwert. |
MultiLine |
Gibt dem Benutzer ein großes Textfeld (z.B. für SQL-Statements). |
Masked |
Verbirgt den Wert vor dem Benutzer (z.B. für Passwörter oder API-Tokens). |
Die vom Benutzer eingegebenen Werte werden in GetColumnsOverride und GetItemsOverride über das Dictionary data.Properties ausgelesen:
string token = data.Properties["Token"];
Ausgabespalten: GetColumnsOverride
GetColumnsOverride wird aufgerufen, wenn der Designer das Schema (die Spalten) der Datenquelle benötigt. Die Methode liefert eine CustomListColumnCollection. Üblicherweise führst du hier einen kleinen Vorab-Request aus, um die verfügbaren Spalten und deren Typen dynamisch zu ermitteln:
protected override CustomListColumnCollection GetColumnsOverride(CustomListData data)
{
return
[
new CustomListColumn("Fact", CustomListColumnTypes.String),
new CustomListColumn("Length", CustomListColumnTypes.Number),
];
}
Externe Datentypen müssen auf die Peakboard-Typen CustomListColumnTypes abgebildet werden:
Peakboard-Typ (CustomListColumnTypes) |
Übliche .NET-/JSON-Entsprechung |
|---|---|
String |
string, JTokenType.String |
Number |
int, float, JTokenType.Integer, JTokenType.Float |
Boolean |
bool, JTokenType.Boolean |
Daten abrufen: GetItemsOverride
GetItemsOverride wird aufgerufen, wenn der eigentliche Datenaustausch stattfindet. Die Methode liefert eine CustomListObjectElementCollection. Jedes CustomListObjectElement besteht aus den Spaltennamen und den tatsächlichen Werten:
protected override CustomListObjectElementCollection GetItemsOverride(CustomListData data)
{
int maxLength = int.Parse(data.Properties["MaxLength"]);
CatFact myFact = GetRandomCatfact(maxLength).Result;
var items = new CustomListObjectElementCollection();
items.Add(new CustomListObjectElement { { "Fact", myFact.Fact }, { "Length", myFact.Length } });
return items;
}
Wichtige Implementierungsregeln
Achtung!
- Keine
async-Overrides. Alle Override-Methoden (GetDefinitionOverride,GetColumnsOverride,GetItemsOverride,SetupOverride,ExecuteFunctionOverride) müssenprotectedsein und dürfen nichtasyncsein. Asynchrone Arbeit muss innerhalb der Methode synchron aufgelöst werden (z.B. über.Resultauf demTask). Externe Aufrufe können in privatenasync-Hilfsmethoden liegen, solange derenTaskim Override synchron aufgelöst wird. - Keine unbehandelten Exceptions. Umschließe
GetColumnsOverride,GetItemsOverride,SetupOverrideundExecuteFunctionOverridevollständig mittry/catch. Wirf imcatchniemals erneut (kein rethrow) – gib stattdessen einen sicheren Fallback-Wert zurück und nutze zusätzlichLog.Error. - Nur serialisierbare Werte. Verwende in einem
CustomListObjectElementausschließlich einfache Typen (String,Number,Boolean), die zu den deklariertenCustomListColumnTypespassen. Lege keine komplexen Objekte (JToken/JObject/JArray/Exception) in die Zellen und vermeidenullbei Strings – nutze stattdessen einen leeren String"".