代码之家  ›  专栏  ›  技术社区  ›  sarsnake

如何订阅C中的其他类事件?

  •  17
  • sarsnake  · 技术社区  · 15 年前

    一个简单的场景:一个引发事件的自定义类。我希望在窗体内使用此事件并对其作出反应。我该怎么做?请举例说明!

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

    3 回复  |  直到 15 年前
        1
  •  26
  •   CSharpAtl    15 年前
            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.....
                }
            }
    
        2
  •  6
  •   Reed Copsey    15 年前

    在你的表格内:

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

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

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

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

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

        3
  •  0
  •   Rex M    15 年前

    假设事件由EventHandler处理,则此代码工作:

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

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