2 Stimmen

Wie kann ein Winform-Benutzerdefiniertes Steuerelement ein anderes Winform-Benutzerdefiniertes Steuerelement benachrichtigen?

Sagen wir in einem benutzerdefinierten Steuerelement habe ich ein benutzerdefiniertes Ereignis namens myEvent definiert. Wenn dieses Ereignis ausgelöst wird, wird es vom übergeordneten Formular erfasst werden.

Wie kann ich dieses Ereignis in einem anderen benutzerdefinierten Steuerelement erfassen, das sich auf dem gleichen übergeordneten Formular befindet? Ich möchte, dass das andere Steuerelement sich irgendwie für das Ereignis des ersten Steuerelements abonniert.

3voto

i8abug Punkte 1692

Ich bin bei der Arbeit mit MVC oft auf eine ähnliche Situation gestoßen. Die Art und Weise, wie ich damit umgehe, ist die Verwendung eines Mediator-Designmusters im Controller.

Im Grunde genommen haben Sie eine Klasse, die eine Register-Funktion und eine Notify-Funktion hat. Die Register-Funktion nimmt ein Objekt entgegen, das ein Listener-Interface implementiert, und eine Nachrichten-ID. Diese werden in einem Wörterbuch gespeichert. Die Notify-Funktion nimmt eine Nachrichten-ID für das Ereignis, das an die Zuhörer gesendet werden muss, und benachrichtigt die entsprechenden Personen, dass das Ereignis eingetreten ist.

Also vielleicht etwas in der Art von

public interface IListener
{
void MessageRaised(int messageId, params object[] arguments);
}

public class Mediator
{
public void Register(IListener listener, int messageId)
{
//... zum Dictionary der Arrays für jede Nachrichten-ID hinzufügen
}

public void NotifyListeners(int messageId, params object[] arguments)
{
//... Schleife durch Zuhörer für die Nachrichten-ID und rufen Sie die MessageRaised-Funktion für jeden auf
}
}

Normalerweise habe ich einen Basiscontroller und es implementiert ein statisches Mediator-Objekt. Dann erben alle meine anderen Controller davon. Wenn Sie den Code hinter verwenden und nicht erben können, können Sie versuchen, das Singleton-Muster zu verwenden. .NET-Static-Klassen sind auch ziemlich gut, da sie einen Konstruktor haben, den Sie ebenfalls verwenden könnten.

In Ihrem Fall würde ich den Code hinter für jede Steuerung implementieren IListener und dann im Konstruktor für jede etwas wie Mediator.GetInstance().Register(this, Messages.MyEvent) haben. Das ist sozusagen ein schneller und schmutziger Weg, der in Zukunft etwas überarbeitet werden kann, um ihn etwas wiederverwendbarer zu machen.

Einige Ressourcen aus einer schnellen Google-Suche

http://www.avajava.com/tutorials/lessons/mediator-pattern.html

http://sourcemaking.com/design_patterns/mediator

Viel Glück

1voto

Mehdi LAMRANI Punkte 10973

Sie könnten dazu die Ereignisbehandlung und Delegaten verwenden und Ihren Empfängersteuerung indirekt für das Ereignis Ihrer Sendersteuerung abonnieren, ÜBER die übergeordnete Steuerung beider Steuerungen, die als Multiplexer fungiert.

0voto

Seattle Leonard Punkte 6198

Die Antwort ist einfach. Erstellen Sie eine Methode im zweiten Formular (dem ohne das Ereignis) mit der richtigen Signatur und markieren Sie sie als öffentlich.

Weisen Sie im übergeordneten Formular die Methode des zweiten Formulars dem Ereignis des ersten zu.

0voto

dexter Punkte 6773

Ja, veröffentlichen Sie einfach und lösen Sie ein Ereignis aus und abonnieren Sie es von Ihrer Listener-Kontrolle aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X