Mit Hilfe von Events werden Aktionen des Anwenders, z. B. die Anwahl eines Menüpunktes oder der Doppelklick auf eine Tabellenzeile, in den CSharp-Quellen gesteuert. Events können sowohl in Dialogklassen als auch in Objektklassen definiert werden.
Implementierung von Events in Dialog- und Objektklassen
Events werden in der jeweiligen Klasse nach folgendem Schema implementiert:
public void SOGEventHandler_EventName(object sender, SOGFireEventArgs feargs)
{
...
feargs.Redirec = xxxx // SOGRedirect-Objekt bei Beadarf
}
Der Name der Methode muss das Schlüsselwort "SOGEventHandler_" als Präfix enthalten. Die Bezeichnung hinter diesem Präfix kann frei gewählt werden. Als Parameter werden "sender" vom Typ "Object" und weitere Parameter vom Typ "SOGFireEventArgs" übergeben. Als Rückgabeparameter muss "void" definiert werden.
Durch Zuweisung eines SOGRedirect-Objektes auf die "Redirect" Eigenschaft des Übergebenen Parameters, wird nach Ausführung der Eventverarbeitung der Dialogschritt aufgerufen, der im SOGRedirect-Objekt definiert wurde. Wenn nach der Ausführung des Events kein neuer Dialogschritt aufgerufen werden soll, braucht "Redirect" nicht zugewiesen zu werden.
public void SOGEventHandler_NeuerEintrag(object sender, SOGFireEventArgs feargs)
{
feargs.Redirect = new SOGRedirect("InfoDBDetails");
}
In diesem Beispiel wird beim Ausführen des Events "NeuerEintrag" der Dialogschritt "InfoDBDetails" ohne Parameter aufgerufen.
public void SOGEventHandler_Aktualisieren(object sender, SOGFireEventArgs feargs)
{
feArgs.Changed = true;
}
Durch das Setzen der Eigenschaft "Changed" auf "true" wird eine Aktualisierung der Controls auf der Dialogmaske erzwungen.
Um zu steuern, ob ein Event als Menüeintrag auf der Dialogmaske aktiviert oder deaktiviert ist, kann eine zusätzliche EventState-Methode implementiert werden.
public void SOGEventState_EventName(object sender, SOGMaskState state)
{
...
}
Die Methode muss als Präfix das Schlüsselwort "SOGEventState_" und den Namen des Events im Namen der Methode enthalten, auf das es wirken soll. Als Parameter wird "state" vom Typ "SOGMaskState" übergeben. Über die Eigenschaft "Enabled" des Parameters "state" kann dann gesteuert werden, ob der dazugehörige Menüeintrag aktiviert oder deaktiviert ist. "Visible" legt die Sichtbarkeit des Events fest.
public void SOGEventState_bearbeiten(object sender, SOGMaskState state)
{
VacosObjectFactory obfac = (VacosObjectFactory)v.GetObjectFactory();
if(obfac.HatRecht(v, "ReleaseVerwaltung"))
{
state.Enabled = true;
}
else
{
state.Enabled = false;
}
}
In diesem Beispiel erscheint der Menueintrag auf der Maske nur dann als "aktiviert" (Enabled = true), wenn dem aktuelle Benutzer das SOG ERP (VACOS)-Recht "ReleaseVerwaltung" zugewiesen ist. Der Methodenkopf des korrespondierenden Events würde folgendermaßen aussehen:
public void SOGEventHandler_bearbeiten(object sender, SOGFireEventArgs feargs)
Events in Dialogklassen als Menüeinträge
Über den Dialogschritt "MenuEdit" lassen sich Events als Menüeinträge einfügen. Dabei wird als Parameter der Dialogschritt der Dialogklasse übergeben, in der die Events implementiert worden sind.
MenuEdit,Release
In dieser Maske lassen sich nun neue Events für den Dialogschritt "Release" einfügen, indem über Feld "Menüpunkt" ein neuer Eintrag eingefügt wird. Der Name des Menüpunktes ist im Prinzip frei wählbar, sollte aber nach Möglichkeit nach folgendem Schema gewählt werden, um kenntlich zu machen, dass der Eintrag ein Event zum Inhalt hat:
Dialogschritt.EventName
Wollen wir hier nun das Event "suchen" aus der Dialogklasse "DlgRelease" einfügen, so würden wir einen Eintrag
Release.suchen
einfügen.
SetContextMenu
In Dialogklassen, die ein Objekt einer Datenbankklasse über ein PropertyGrid, Text- oder Displayfelder anzeigen, lassen sich die Kontextmenüs der Datenbankklasse mit der Methode
public void SetContextMenu(string UniqName, object obj)
direkt im Menü der Dialogmaske anzeigen.
Beispiel:
public Lagerplatz SOGRefObject_Lagerplatz()
{
LagerplatzTable lpTab = Dbs.GetLagerplatzTable();
Lagerplatz lp = lpTab.GetLagerplatz(v.Firma, ((VacosSession)v.sess).Lg(v), this.m_key);
SetContextMenu("Lagerplatz", lp);
return lp;
}
In diesem Beispiel werden die Menüeinträge der Klasse "Lagerplatz" im Menü der Dialogmaske angezeigt, in der diese Methode implementiert ist.
Events aus Datenbankklassen lassen sich in den Dialogklassen, aus denen sie aufgerufen werden, übersteuern. Damit lässt sich das Verhalten eines solchen Events je nach Dialogklasse anpassen. Diese Funktionalität kann beispielsweise hilfreich sein, wenn ein Event nach der Ausführung der implementierten Funktionen einen Redirect auslöst, innerhalb einer ganz anderen Dialogmaske aber auch ein ganz anderer Redirect erfolgen soll. Zusätzlich dazu lässt sich auch der EventState (z. B. Aktiviert oder Deaktiviert) beeinflussen, so dass ein Event, das normalerweise immer aktiviert ist, auf einer anderen Dialogmaske deaktiviert werden kann.
public override void SOGHandleMessage(object sender, SOGMessageEventArgs e)
{
if (e is SOGPretranslateObjectMessageEventArgs)
{
SOGPretranslateObjectMessageEventArgs args = (SOGPretranslateObjectMessageEventArgs) e;
if (args.Fkt == "Delete")
{
e.Handled = true;
if (v.AreYouSure(args.FktText, false))
{
((Nachrichten)((SOGPretranslateObjectMessageEventArgs)e).Obj).DeleteDocument(v);
e.Redirect = new SOGRedirect("RETURN");
}
}
}
else if (e is SOGPretranslateMaskStateMessageEventArgs)
{
if (((SOGPretranslateMaskStateMessageEventArgs)e).Fkt == "Info")
{
((SOGPretranslateMaskStateMessageEventArgs)e).State.Enabled = false;
e.Handled = true;
}
}
base.SOGHandleMessage(sender, e);
}
Innerhalb der Methode "SOGHandleMessage" lassen sich Meldungen vom Typ "SOGPretranslateObjectMessageEventArgs" und "SOGPretranslateMaskStateMessageEventArgs" abfangen, die von einem Event einer Datenbankklasse gesendet werden.
SOGPretranslateObjectMessageEventArgs
Die Meldung SOGPretranslateObjectMessageEventArgs wird gesendet, sobald das Event ausgelöst wird.
Im obigen Beispiel wird das Event "SOGEventHandler_Delete" der Klasse "Nachrichten" abgefangen und die eigentliche Funktionalität dieses Events, die Methode "DeleteDocument", aufgerufen. Anders als in der eigentlich Implementierung des Events wird jedoch anstatt "null" ein "SOGRedirect("RETURN")" zurückgeliefert, was einen Rücksprung auf den vorherigen Dialogschritt bewirkt.
Der Name des Events, z. B. "Delete" (aus SOGEventhandler_Delete)
Der Text einer hinterlegten Sicherheitsabfrage (z. B. bei Löschfunktionen)
Das Objekt, von dem das Event ausgelöst wird (z. B. ein Objekt der Nachrichten-Klasse)
Wird diese Eigenschaft auf "true" gesetzt, wird die eigentliche Verarbeitung des Events abgebrochen und kann durch eigene Funktionalitäten ersetzt werden.
Das SOGRedirect-Objekt, das vom Event zurückgeliefert wird. Hier kann dann auch ein neues SOGRedirect-Objekt zugewiesen werden.
SOGPretranslateMaskStateMessageEventArgs
Die Meldung SOGPretranslateMaskStateMessageEventArgs wird ausgelöst, bevor der entsprechende Menüpunkt zu diesem Event auf der Dialogmaske visualisiert wird.
Im obigen Beispiel wir der EventState "SOGEventState_Info" abgefangen und der Menüpunkt "Dokumenten-Info" durch Setzen der "Enabled"-Eigenschaft des SOGMaskState-Objektes auf "false" deaktiviert.
Der Name des EventState, z. B. "Info" (aus SOGEventState_Info)
Wird diese Eigenschaft auf "true" gesetzt, wird die Verarbeitung des EventState abgebrochen und kann durch eigene Funktionalitäten ersetzt werden.
Das SOGMaskState-Objekt des EventState
Folgende Eventarten sind zulässig:
Einfaches Event das sich auf den Dialog bezieht. D.h. es wird nicht durch selektierte Objekte beeinflusst und die Methode muss in der Dialogklasse implementiert sein. Eine Änderung des Eventstates greift erst bei Maskenaktualisierung.
Kontextsensitives Event. D.h. es wird nur dann angezeigt, wenn das entsprechende Objekt selektiert ist. Die Eventmethode wird im Objekt gesucht, falls sie nicht mit base präfixiert ist, mit "base" in der Dialogklasse.
Ist dieser Typ an einer Liste von Objekten definiert, so wird das Event pro Objekt ausgeführt. EventStates werden bei jedem Selektieren evaluiert.
Wird für eine Liste von Objekten verwendet. Führt ein objectevent an dem ersten Objekt der Liste aus und übergibt dabei die Liste aller selektierten Objekte an diesen EventHandler . D.h. es wird nur ein Event ausgeführt und der EventHandler muss darauf vorbereitet sein, eine Liste von Objekten zu bearbeiten.
Altlast, sollte nicht mehr verwendet werden.
Funktionsweise ähnlich wie singleobjectevent. Jedoch wird hier nicht kontextsensitiv reagiert und das Event muss in der Dialogklasse implementiert sein.
Grundsätzlich gilt, dass sobald sich ein Event auf selektierte Objekte im Dialog bezieht, dieses entsprechend ein objectevent sein sollte. Nur dann wird das Menü entsprechend ein- und ausgeblendet, sodass dem Anwender auch sofort klar ist, auf was sich das Event bezieht.
Starten in einer neuen Instanz
Das Starten eines Dialoges aus einem Event heraus kann beeinflusst werden, sodass ein Starten in einer neuen Instanz aktiviert bzw. erlaubt oder aber deaktiviert bzw. verboten wird.
Grundsätzlich ist diese Funktion für event standardmäßig deaktiviert und für objectevent und singleobjectevent aktiviert.
Um die Funktion also entsprechend an oder abzuschalten muss in para4 entweder enableNewInstance oder disableNewInstance eingetragen werden.