【问题标题】:How to subscribe to other class' events in C#?如何在 C# 中订阅其他类的事件?
【发布时间】:2009-05-27 00:02:57
【问题描述】:

一个简单的场景:一个引发事件的自定义类。我希望在表单中使用此事件并对其做出反应。

我该怎么做?

请注意,表单和自定义类是不同的类。

【问题讨论】:

    标签: c# events .net-2.0 event-handling


    【解决方案1】:
    public class EventThrower
    {
        public delegate void EventHandler(object sender, EventArgs args) ;
        public event EventHandler ThrowEvent = delegate{};
    
        public void SomethingHappened() => ThrowEvent(this, new EventArgs());
    }
    
    public class EventSubscriber
    {
        private EventThrower _Thrower;
    
        public EventSubscriber()
        {
            _Thrower = new EventThrower();
            // using lambda expression..could use method like other answers on here
    
            _Thrower.ThrowEvent += (sender, args) => { DoSomething(); };
        }
    
        private void DoSomething()
        {
           // Handle event.....
        }
    }
    

    【讨论】:

    • 感谢您提供出色的解决方案。我在发布问题后马上就想通了,我的解决方案与您的非常相似。
    • stackoverflow.com/questions/8335131/… 用于 .NET2 中的实现
    • @CSgarpAtl 我看到这被选为正确答案。不幸的是,即使我遵循了每一步,我也无法让它发挥作用。我试图让我的主窗体知道我的用户控件中发生的方法。
    【解决方案2】:

    在您的表单中:

    private void SubscribeToEvent(OtherClass theInstance) => theInstance.SomeEvent += this.MyEventHandler;
    
    private void MyEventHandler(object sender, EventArgs args)
    {
        // Do something on the event
    }
    

    您只需像订阅表单中的事件一样订阅其他类的事件。要记住的三个重要事项:

    1. 您需要确保您的方法(事件处理程序)具有适当的声明,以与其他类上的事件委托类型相匹配。

    2. 其他类的事件需要对您可见(即:公共或内部)。

    3. 订阅类的有效实例,而不是类本身。

    【讨论】:

    • @Reed_Copsey oyu 能否提供更多代码,不知何故我的事件不会被处理程序接受
    • @Gobliins 我不知道您的问题是什么 - 我建议您详细询问您自己的问题。
    • 和题目一样的问题,但是nvm我已经解决了。
    【解决方案3】:

    假设您的事件由 EventHandler 处理,则此代码有效:

    protected void Page_Load(object sender, EventArgs e)
    {
        var myObj = new MyClass();
        myObj.MyEvent += new EventHandler(this.HandleCustomEvent);
    }
    
    private void HandleCustomEvent(object sender, EventArgs e)
    {
        // handle the event
    }
    

    如果您的“自定义事件”需要其他签名来处理,则需要使用该签名。

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多