Frage

Ist es möglich, im Rahmen einer Reihe von Umständen der Lage sein, dies zu tun?

Meine derzeitigen Umständen sind dies:

public class CustomForm : Form
{
    public class CustomGUIElement
    {
    ...
        public event MouseEventHandler Click;
        // etc, and so forth.
    ...
    }

    private List<CustomGUIElement> _elements;

    ...

    public void CustomForm_Click(object sender, MouseEventArgs e)
    {
        // we might want to call one of the _elements[n].Click in here
        // but we can't because we aren't in the same class.
    }
}

Mein erster Gedanke war, eine ähnliche Funktion wie haben:

internal enum GUIElementHandlers { Click, ... }
internal void CustomGUIElement::CallHandler(GUIElementHandler h, object[] args) {
    switch (h) {
        case Click:
            this.Click(this, (EventArgs)args[0]);
            break;
        ... // etc and so forth
    }
}

Es ist eine schrecklich hässlich Flickschusterei, aber es sollte funktionieren ... Es muss jedoch eine elegantere Lösung? Die .NET-Bibliothek tut dies die ganze Zeit mit Meldungshandler und ruft Ereignisse in Control. hat jemand andere / bessere Ideen?

War es hilfreich?

Lösung

Sie müssen nur zum Aufrufen der Veranstaltung eine öffentliche Methode hinzuzufügen. Microsoft tut dies bereits für einige Veranstaltungen wie Perform für Steuerelemente, die eine Klicken Sie auf Ereignis.

aussetzen
public class CustomGUIElement    
{
    public void PerformClick()
    {
        OnClick(EventArgs.Empty);
    }

    protected virtual void OnClick(EventArgs e)
    {
        if (Click != null)
            Click(this, e);
    }
}

Sie würden dann gehen Sie wie folgt in Ihrem Beispiel Event-Handler ...

public void CustomForm_Click(object sender, MouseEventArgs e)        
{
    _elements[0].PerformClick();
}

Andere Tipps

Die Veranstaltung Schlüsselwort in c # ändert die Erklärung des Delegierten. Es verhindert, dass eine direkte Zuordnung zu den Delegierten (können Sie nur verwenden, + = und - = auf einer Veranstaltung)., Und es verhindert Aufruf des Delegierten von außerhalb der Klasse

So können Sie Ihren Code ändern könnte wie folgt aussehen:

public class CustomGUIElement
{
...
    public MouseEventHandler Click;
    // etc, and so forth.
...
}

Dann können Sie das Ereignis von außerhalb der Klasse wie folgt aufrufen.

myCustomGUIElement.Click(sender,args);

Der Nachteil ist, dass Code, der die Klasse mit beliebigen registrierten Handler überschreiben kann sehr einfach mit dem Code wie folgt aus:

myCustomGUIElement.Click = null;

Dies ist nicht zulässig, wenn die Click-Delegierten als ein Ereignis deklariert wird.

Sie sollten wirklich den Code wickeln Sie von außen in einem Verfahren ausführen können, wollen. Das Verfahren kann dann tun, was auch immer Ihre Veranstaltung tun würde -. Und das Ereignis würde auch stattdessen diese Methode aufrufen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top