2015-04-02 3 views
0

Хорошо, я просто наращиваю на winforms после использования WPF в течение последних 3 лет. Мне нужно запустить событие из одной формы (при обновлении информации о клиенте), а другая форма подписаться на это событие и выполнить некоторую обработку для обновления информации о клиенте, которая отображается, если обновленный клиент соответствует клиенту в другой форма. Я только смог найти примеры этого в формах, которые являются дочерними/родительскими или от пользовательского элемента управления до родительской формы, где родительская форма имеет ссылку на дочернюю форму, которая подписывается на событие. Я не могу найти какую-либо информацию о том, как я мог бы установить это в двух формах, которые не связаны друг с другом и не имеют ссылок друг на друга. Я просто хочу запустить событие из одной формы и забрать его в другом. Похоже, это должно быть довольно легко, но мне не очень повезло. Любая помощь приветствуется! Благодаря!События в WinForms между двумя несвязанными формами

UPDATE: Вот что я имею установку до сих пор:

объекта, содержащего событие и способ поднять событие.

Public Class CustomerEvents 

    Public Event CustomerInformationUpdatedEvent(ByVal customerId As Integer) 

    Public Sub RaiseCustomerInformationUpdated(ByVal customerId As Integer) 
     RaiseEvent CustomerInformationUpdatedEvent(customerId) 
    End Sub 

End Class 

форма, которая поднимает событие:

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click   
    Dim customerEvents As New CustomerEvents 
    customerEvents.RaiseCustomerInformationUpdated(iCustomerID) 
    Me.Close() 
End Sub 

форма, которую необходимо подписаться на событие:

Private Sub myForm_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated 
    Dim customerEvents As New CustomerEvents 
    AddHandler customerEvents.CustomerInformationUpdatedEvent, AddressOf HandleCustomerInformationUpdated 
End Sub 

Private Sub HandleCustomerInformationUpdated(ByVal customerid As Integer) 
     ' Processing 
End Sub 

Но HandleCustomerInformationUpdated никогда не быть пораженным. Что я делаю не так?? Благодаря!

+0

Использование 'As New' не может работать, вы получаете новый экземпляр класса, для которого никто еще не мог подписаться на мероприятие. –

ответ

1

Лучшим вариантом было бы использовать сервис pub/sub type, который вы можете передать в обе формы. В основном создайте объект, в котором есть событие, и метод, который запускает это событие. Затем форма, которая должна уведомить других, может принимать в этом объекте и при необходимости вызвать метод триггера, а другие формы могут быть прикреплены к этому объекту.

EDIT

Следующая неполная декларация служба должна дать некоторые идеи.

public class EventService { 
    public EventHandler MyEvent {add;remove;} 
    public void TriggerMyEvent() { 
     MyEvent(); 
    } 
} 

Это может затем использоваться, создавая одну копию и передавая экземпляр в Организация мероприятий конструктор форм. Форма публикации затем просто сделать myEventServiceInstance.TriggerMyEvent() и Подписавшиеся формы, по созданию зарегистрируют в myEventServiceInstance.MyEvent;

В идеале вы должны использовать контейнер IoC, чтобы передать один экземпляр в и обрабатывать жизни объекта, но это выходит за рамки Эта проблема.

+0

Спасибо, это то, о чем я тоже думаю. Я просто не знал, как его реализовать. У меня не должно возникнуть проблемы с созданием объекта с помощью события и метода, которые запускают его, но я немного запутался в том, как я мог бы его запустить, а затем поймать его на других формах. Можете ли вы поднять какой-нибудь псевдокод или пример? Благодаря! – DonnieDarko

+0

Еще раз спасибо. Эта строка дает мне паузу: «Затем ее можно использовать, создав одну копию и передав экземпляр EventService в конструктор для форм». потому что эти формы полностью не связаны и не открываются нигде в одном месте. Думаю, у меня мог бы быть модуль с экземпляром в нем, который я передаю конструкторам форм? – DonnieDarko

+0

Да, именно здесь вы можете использовать что-то вроде Unity для обработки инъекции зависимостей.Независимо от того, нужен ли вам отдельный модуль, зависит от того, хотите ли вы сделать публикацию через модули и точно, как ваши зависимости устанавливаются прямо сейчас. Если все компоненты подписки находятся в модулях, которые зависят от модуля издателя, то вы, вероятно, можете просто включить службу в модуль издателя. – Travis

Смежные вопросы