Зарегистрируйте событие загрузки для каждой формы из «Приложения» - PullRequest
2 голосов
/ 04 декабря 2010

Событие Load, и я могу сделать что-то вроде

 (new Form1()).Load += 

Но могу ли я зарегистрировать событие для каждой формы в моем проекте из домена приложения? Есть ли такое событие, как «OnFormOpen»?

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Чтобы зарегистрировать событие для каждой формы в проекте, потребуется наличие экземпляров созданных форм. Затем вам нужно назначить делегата для события Load каждого экземпляра формы.

Назначение события Load для самого типа невозможно, требуется экземпляр типа, чтобы назначить обработчик для события Load. Часть кода может быть включена в конструктор для регистрации события загрузки каждый раз, когда создается экземпляр формы.

Вот фрагмент кода проекта, содержащего 3 класса форм (Form1 (форма запуска), 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
    }
}
0 голосов
/ 05 декабря 2010

Я нашел что-то очень интересное, чтобы наблюдать за активами.См. Статью CodeProject , например:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...