Kommunikation zwischen eigenen User Controls in ASP.NET

Als ein ganz wichtiges Mittel zur Kapselung von immer wiederkehrenden Bestandteilen bei ASP.NET Webanwendugen existieren User Controls. Im Gegensatz zu Custom Controls lassen sich User Controls recht schnell und einfach innerhalb einer Anwendung erstellen, können aber nicht wie Custom Controls in anderen Anwendungen weiterverwendet werden.

Prinzipiell sollte man User Controls immer als eigenständige Einheit ohne Abhängkeiten zu anderen Controls oder Seiten entwickeln. Was aber, wenn man einem anderen User Control ein Ereignis senden will bzw. eine Methode aufrufen will? Beispiel: ein User Control für eine Statuszeile. Andere User Controls sollen dem Statuszeilencontrol den aktuellen Zustand mitteilen. Beispielsweise, daß Daten erfolgreich geladen oder aktualisert worden sind. Diese Infos gehören eigentlich zum guten Stil, denn in Zeiten von Ajax kann der User nicht mehr anhand des fehlenden Flackerns beim Postback erkennen, ob eine Aktion nun ausgeführt worden ist oder nicht.

Zum Senden einer Nachricht an so ein Statuszeilecontrol bedarf es erst einmal einer Klasse zur Aufnahme der Argumente:

public class StatusMessageEventArgs : EventArgs {
    private string _message;
    private int _type;
    public enum Types {
        Info,
        Error
    }
    public String Message {
        get { return _message; }
        set { _message = value;}
    }
    public Types Type {
        get { return (Types)_type; }
        set { _type = (int)value; }
    }
}

Hier wird einerseits eine Message als String übergeben, als auch der Typ der Message: Info oder Error. Als nächstes benötigen wir eine öffentliche Methode in dem Statuszeilencontrol, dass die Nachricht empfangen und verarbeiten soll:

public void HandleStatusMessageEvent(object sender, StatusMessageEventArgs e) {
    if (e.Type == StatusMessageEventArgs.Types.Info) {
        this.TextInfo = e.Message;
    } else {
        this.TextError = e.Message;
    }
}

this.TextInfo und this.TextError sind nur weitere private Properties, die die Statuszeile entsprechend aktualiseren. Im User Control, daß eine Nachricht an das Statuszeilencontrol senden will, muß ein Eventhandler definiert werden:

public event EventHandler<StatusMessageEventArgs> OnSendStatusMessage;

Dieser Eventhandler kann dann entsprechend im User Control aufgerufen werden:

if (OnSendStatusMessage != null) {
    StatusMessageEventArgs message = new StatusMessageEventArgs();
    message.Type = StatusMessageEventArgs.Types.Info;
    message.Message = "Daten sind aktualisert worden";
    OnSendStatusMessage(this, message);
}

Letztendlich muss dann auf der Seite, die die beiden User Controls enthält eine Verknüpfung zwischen Eventhandler und der Methode hergestellt werden:

this.MyUserControl.OnSendStatusMessage += new 
  EventHandler<StatusMessageEventArg>(this.StatusControl.HandleStatusMessageEvent);

Das war’s! Durch diese recht lose Kopplung können User Controls miteinander kommunizieren. Die Aufgabe der Verknüpfung der Controls übernimmt dann immer die Seite, in die die User Controls aufgenommen werden.

Updated: