Korrekt zugreifen innerhalb der neuen Ereignis-Abonnements

Beim Anlegen von Abonnements auf die neuen Ereignisse (ich schrieb vor einiger Zeit darüber, wie Events und Subscriptions jetzt funktionieren) muss ich häufig nachschlagen, wie man mit den vorgegebenen Parametern auf dieses und jenes zugreifen kann. Deshalb hier ein paar zufällig ausgewählte Beispiele in einer Auflistung, die keinerlei Anspruch auf Vollständigkeit erhebt.

Die Beispiel beziehen sich allesamt auf die neuen Ereignisse, die das Framework anbietet. Bei Pre- und Post-Events hat sich nichts geändert daran, wie man mit dem Args-Objekt umgeht. Bei Delegates sind die Parameter natürlich von Fall zu Fall unterschiedlich – hat ja auch jeder seine eigene Declaration.

Form Datasource von xFormRun ausgehend

[FormEventHandler(formStr(SomeForm), FormEventType::Initialized)]
public static void SomeForm_OnInitialized(xFormRun sender, FormEventArgs e)
{
    FormDataSource MyRandomTable_ds = sender.dataSource(formDataSourceStr(SomeForm, MyRandomTableDS));
    ...
}

FormRun aus Form Datasource holen

[FormDataSourceEventHandler(formDataSourceStr(MyForm, MyRandomTableDS), FormDataSourceEventType::Written)]
public static void MyRandomTableDS_OnWritten(FormDataSource sender, FormDataSourceEventArgs e)
{
    FormRun formRun = sender.formRun() as FormRun;
    // man kann sogar eigene Methoden aufrufen (ich glaube allerdings, dass IntelliSense in diesem Fall nicht funktioniert)
    formRun.myCustomMethod();
}

FormRun vom Form Control abholen

[FormControlEventHandler(formControlStr(MyForm, MyButton), FormControlEventType::Clicked)]
public static void MyButton_OnClicked(FormControl sender, FormControlEventArgs e)
{
   FormRun formRun = sender.formRun() as FormRun; formRun.myCustomMethod();
}

Zugriff auf Form Control über xFormRun

[FormEventHandler(formStr(SomeForm), FormEventType::Initialized)]
public static void SomeForm_OnInitialized(xFormRun sender, FormEventArgs e)
{
    // beispielhaftes Setzen auf unsichtbar
    sender.design().controlName(formControlStr(SomeForm, MyControl)).visible(false);
}

Aktuellen Datensatz aus Form Control Event

[FormControlEventHandler(formControlStr(SomeForm, SomeButton), FormControlEventType::Clicked)]
public static void SomeButton_OnClicked(FormControl sender, FormControlEventArgs e)
{
    // beispielhaft Zugriff über Nummer der Datasource; ich empfinde den Weg über formDataSourceStr als wesentlich robuster
    SomeTable callerRec = sender.formRun().dataSource(1).cursor();
}

Common konvertieren und DataEventArgs verwenden

[DataEventHandler(tableStr(AnyTable), DataEventType::ValidatedWrite)]
public static void InventLocation_onValidatedWrite(Common sender, DataEventArgs e)
{
    // konvertiere Common in AnyTable
    AnyTable anyTable = sender;
    // die DataEventArgs sind ValidateEventArgs und können entsprechend konvertiert werden
    ValidateEventArgs validateEventArgs = e;
    // die ValidateEventArgs haben das aktuelle Resultat der Validierung schon an Board
    boolean ret = validateEventArgs.parmValidateResult();
    // hier hat die Tabelle eine Implementierung für eine weitere Validierung und gibt das Resultat zurück
    ret = anyTable.doSomeAdditionalCustomValidation(ret);
    // das Resultat der Validierung wird über die args wieder mitgeteilt
    validateEventArgs.parmValidateResult(ret);
}

Das onValidatedFieldValue Event korrekt verwenden

[DataEventHandler(tableStr(SomeTable), DataEventType::ValidatedFieldValue)]
public static void SomeTable_onValidatedFieldValue(Common sender, DataEventArgs e)
{
    SomeTable someTable = sender;
    // die DataEventArgs sind eigentlich ValidateFieldValueEventArgs und diese lassen einen den Feldnamen wissen
    ValidateFieldValueEventArgs validateEventArgs = e;
    boolean ret = validateEventArgs.parmValidateResult();
    FieldName fieldName = validateEventArgs.parmFieldName();
    switch (fieldName)
    {
        case fieldStr(SomeTable, SomeCustomField):
            ... do some magic
            break;
    }
    validateEventArgs.parmValidateResult(ret);
}

Das MappedEntityToDataSource Event verwenden

[DataEventHandler(tableStr(MyTableEntity), DataEventType::MappedEntityToDataSource)]
public static void MyTableEntity_onMappedEntityToDataSource(Common _sender, DataEventArgs _eventArgs)
{
    DataEntityContextEventArgs eventArgs = _eventArgs;
    MyTableEntity entity = _sender;
    if (eventArgs.parmEntityDataSourceContext().name() == dataEntityDataSourceStr(MyTableEntity, MyTable))
    {
        MyTable myTable = eventArgs.parmEntityDataSourceContext().getBuffer();
        ... do some magic with it
    }
}

2 Gedanken zu “Korrekt zugreifen innerhalb der neuen Ereignis-Abonnements

Schreibe einen Kommentar