2010-12-04 9 views

Antwort

1

Um ein Ereignis für jedes Formular im Projekt zu registrieren, müssen Instanzen der Formulare erstellt werden. Dann müssen Sie dem Load-Ereignis jeder Formularinstanz einen Delegaten zuweisen.

Das Zuweisen des Load-Ereignisses zum Typ selbst ist nicht möglich. Eine Instanz des Typs muss den Handler dem Load-Ereignis zuweisen. Ein Teil des Codes könnte im Konstruktor enthalten sein, um das Ladeereignis jedes Mal zu registrieren, wenn eine Formularinstanz erstellt wird.

Hier ist ein Code-Snippet eines Projekts, das 3 Formularklassen enthält (Form1 (Startformular), Form2, Form3).

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     LoadEventRegister loadEventRegister = new LoadEventRegister(); 
     Form[] formInstances = new Form[] {new Form2(), new Form3()}; 
     loadEventRegister.RegisterLoadOnForms(formInstances); 

     foreach (Form formInstance in formInstances) 
     { 
      formInstance.Show(); 
     } 
    } 
} 

public class LoadEventRegister 
{ 
    public void RegisterLoadOnForms(IEnumerable<Form> formInstances) 
    { 
     foreach (Form formInstance in formInstances) 
     { 
      EventInfo eventInfo = formInstance.GetType().GetEvent("Load"); 
      Type eventHandlerType = eventInfo.EventHandlerType; 

      MethodInfo eventHandler = this.GetType().GetMethod("Generic_Load"); 

      Delegate d = Delegate.CreateDelegate(eventHandlerType, this, eventHandler); 
      eventInfo.AddEventHandler(formInstance, d); 
     } 
    } 

    public void Generic_Load(object sender, EventArgs e) 
    { 
     MyCustomLoad(); 
    } 

    private void MyCustomLoad() 
    { 
     // Do something 
    } 
} 
+1

Nebenbei bemerkt, können Sie jede Assembly geladen in die AppDomain erfassen, indem Sie in diesem Fall Einhaken http://msdn.microsoft.com/en-us/library/system. appdomain.assemblyload.aspx – Tom

0

Ich fand etwas sehr Interessantes zu sehen Form actives. Wenden Sie sich an den CodeProject article, zB:

public class ApplicationEventHandler 
{ 
    MessageFilterImp filter; 

    public void Init() 
    { 
     filter = new MessageFilterImp(); 
     Application.AddMessageFilter(filter); 
    } 
} 

internal class MessageFilterImp : IMessageFilter 
{ 
    public bool PreFilterMessage(ref Message m) 
    { 
     FormCollection forms = Application.OpenForms; 
     foreach (Form form in forms) 
     { 
      Console.WriteLine("---" + System.DateTime.Now); 
      Console.WriteLine(form.Name); 
     } 
     return false; 
    } 
} 
Verwandte Themen