2009-09-04 19 views
4

Ich möchte ein Ereignis manuell mit C# auslösen. Sagen wir zum Beispiel, ob ich ein Form_closing-Ereignis von Form A aus Form B auslösen möchte. Wie geht das?manuell auslösen das Ereignis in C#

Nach ein paar Kommentare. Ich denke, ich muss mehr dazu erklären.

Da mein Formular Ein Verweis auf eine DLL ist, die eine benutzerdefinierte Taskleiste in dem Desktop erstellt, Es ist eine Situation für mich, die die benutzerdefinierte Task-Leiste von Form B zu schließen Ich habe bereits versucht FormA.Close() aus Formular B. Wenn ich dies tue, wird die .dll aus der App-Domäne entladen und dadurch wird der von der benutzerdefinierten Taskleiste belegte Speicherplatz blockiert.

Aber das ist nicht der Fall, wenn ich auf die Schließen-Schaltfläche in der benutzerdefinierten Taskleiste klicke. Wenn ich das tue, wird der Raum frei.

Dies ist der Grund, ich möchte das Schließen-Ereignis von Form A manuell aus Formular B auslösen, die mein Problem lösen wird.

Danke.

Antwort

13

wir folgende in einem Projekt haben:

Es gibt eine GlobalNotifier Klasse war, die Ereignisse definiert wir in verschiedenen Modulen der Anwendung, wie diese

public static class GlobalNotifier 
{ 

    public static event VoidEventHandler EnvrionmentChanged; 

    public static void OnEnvrionmentChanged() 
    { 
     if (EnvrionmentChanged != null) 
     { 
      EnvrionmentChanged(); 
     } 
    } 
} 

Dann könnten Sie erhöhen, nutzen wollte dieses Ereignis überall, wenn Sie benötigen der Rest der Anwendung zu informieren, dass die Umgebung verändert hat, wie diese

GlobalNotifier.OnEnvrionmentChanged(); 

Und auch Sie können su Beschreiben Sie dieses Ereignis, wo immer Sie über die Änderung der Umgebung informiert werden möchten.

public ReportingService() 
    { 
     GlobalNotifier.EnvrionmentChanged += new VoidEventHandler(GlobalNotifier_EnvrionmentChanged); 
    } 

    void GlobalNotifier_EnvrionmentChanged() 
    { 
     //reset settings 
     _reportSettings = null; 
    } 

Also, wenn Sie die Umwelt verändert, erhöht man das Ereignis, und jeder, der darüber und führen einige Aktionen wissen musste, zur Kenntnis gebracht wurde. Vielleicht ähnlich sein, was Sie erreichen müssen.

Auch, wenn Sie Parameter übergeben müssen, können Sie das Ereignis, wie Sie mögen, im Grunde definieren -

public static event VoidEventHandler<SomeObject, List<OtherObject>> SomethingUpdated; 

    public static void OnSomethingUpdated(SomeObject sender, List<OtherObject> associations) 
    { 
     if (SomethingUpdated != null) 
     { 
      SomethingUpdated(sender, associations); 
     } 
    } 

    // ... 

    MyClass.SomethingUpdated+= new VoidEventHandler<SomeObject, List<OtherObject>>(MyClass_SomethingUpdated); 

    // ... 

    void MyClass_SomethingUpdated(SomeObject param1, List<OtherObject> param2) 
    { 
     //do something 
    } 
1

Sie würden die OnFormClosing() Methode der Form-Klasse aufrufen. Sie können dies mit jedem Ereignis durchführen, das über eine gepaarte On...()-Methode verfügt.

+0

ich meine, ich mag wie das Ereignis in Form A aus Form B Sprich erhöhen, die Bereitstellung das folgende in Form B Form_A.FormClosing + = new System.Windows.Forms.FormClosingEventHandler (------); Wenn das richtig wäre, sagen Sie mir, wie man die Objekt- und Ereignisargumente an A – Anuya

+0

weiterleitet. Sie können das On ...() in einer öffentlichen Methode verfügbar machen, aber wie Joel sagte, wenn Sie das Ereignis manuell auslösen möchten Wenn Sie Form.Close() aufrufen, machen Sie wahrscheinlich etwas falsch. – mgbowen

+0

@ darkassassin93, einige weitere Erklärung für mein Szenario gegeben. – Anuya

1

Schließen Sie das Formular. Das wird das Ereignis auslösen. Wenn Sie das Ereignis getrennt vom Schließen des Formulars auslösen möchten, machen Sie etwas falsch. Verschieben Sie diesen Code in eine separate Methode, die Sie vom Ereignis und von FormB aus aufrufen können.

FormAInstance.Close() 

Beginnend mit Visual Studio 2005 (.Net 2.0) haben Formulare automatische Standardinstanzen. Es hört sich so an, als ob Sie das verwenden. Sie sollten wissen, dass diese Funktion hauptsächlich aus Gründen der Abwärtskompatibilität zu VB6 besteht. Sie sollten wirklich eine neue Instanz des Formulars erstellen und verwenden. Wenn Sie das tun, sollten Sie einfach die Methode .Close() für diese Instanz aufrufen können, ohne dass die App-Domäne schließt.

Wenn Sie diesen Speicherplatz wiederverwenden möchten, können Sie auch einfach .Hide() versuchen, das Formular zu öffnen, anstatt es zu schließen.

+0

Ich meine, ich möchte das Ereignis in Formular A von Formular B auslösen. Sagen Sie wie, vorausgesetzt, die unten in Form B Form_A.FormClosing + = neue System.Windows.Forms.FormClosingEventHandler (------); Wenn das richtig wäre, sagen Sie mir, wie man die Objekt- und Ereignisargumente an A – Anuya

+0

@JoelCoehoorn weiterleitet, mit weiteren Erklärungen für mein Szenario. – Anuya

+0

Vielleicht haben Sie Ihre Terminologie falsch. Es klingt ein bisschen so, als ob du _subscribe_ oder _listen_ für das Event möchtest. Es anheben bedeutet etwas anderes. –

1

Es klingt für mich, aus Ihren Kommentaren, wie Sie nicht möchten erhöhen Ereignis eines Formulars aus dem anderen; Sie wollen nur behandeln Ereignis eines Formulars aus dem anderen.

Ja, das können Sie tun. FormB muss einen Verweis auf FormA haben. Es gibt verschiedene Möglichkeiten, dies zu tun; eine einfache Möglichkeit ist es, eine FormA type-Eigenschaft in Ihrem FormB Klasse zu haben, wie folgt aus:

public FormA TheOtherForm { get; set; } 

Sie setzen diese Eigenschaft auf Ihrer Instanz von FormA, und dann fügen Sie den Event-Handler, wie Sie in den Kommentaren beschrieben haben .

Sie müssen nicht FormA als die Art Ihrer Eigenschaft verwenden; Jedes Formular hat das Ereignis FormClosing, Sie können also einfach Formular als Typ verwenden, wenn Sie möchten.

+0

Form_A.FormClosing + = neu System.Windows.Forms.FormClosingEventHandler (------); Wenn das richtig wäre, sag mir, wie man die Objekt- und Ereignisargumente übergibt – Anuya

Verwandte Themen