【问题标题】:.NET custom event organization assistance.NET 自定义事件组织帮助
【发布时间】:2010-01-27 23:14:10
【问题描述】:

作为 C# 的新手,我最近一直在研究自定义事件,虽然我认为我现在了解了设置自定义事件所需的基本部分,但我无法确定每个事件的位置片属于。具体来说,这就是我想要做的。

我有一个表示内部数据结构布局的树控件。当数据在树中重新排列时(通过拖放),我需要重新排列底层数据结构以匹配。

所以,我试图从树控件的“Drop”事件处理程序中触发我自己的自定义事件(在我验证了 drop 之后)。我的想法是我的事件的订阅者将处理基础数据的重新排序。

我只是在努力确定在哪里应该创建和/或使用每个事件机制。

如果有人可以为我提供上述的基本示例,那就太好了。例如,可能是一个简单的示例,它从现有的 button_click 事件中设置并触发自定义事件。这似乎可以很好地模拟我正在尝试做的事情。

另外,如果我解决问题的方法似乎完全错误,我也想知道。

【问题讨论】:

    标签: c# .net events


    【解决方案1】:

    您需要为您的事件处理程序声明原型,并且保存已在类中注册的事件处理程序的成员变量拥有树视图。

    // this class exists so that you can pass arguments to the event handler
    //
    public class FooEventArgs : EventArgs
    {
        public FooEventArgs (int whatever) 
        { 
           this.m_whatever = whatever; 
        }
    
        int m_whatever;
    }
    
    // this is the class the owns the treeview
    public class MyClass: ...
    {
        ...
    
        // prototype for the event handler
        public delegate void FooCustomEventHandler(Object sender, FooEventArgs args);
    
        // variable that holds the list of registered event handlers
        public event FooCustomEventHandler FooEvent;
    
        protected void SendFooCustomEvent(int whatever)
        {
            FooEventArgs args = new FooEventArgs(whatever);
            FooEvent(this, args);
        }
    
        private void OnBtn_Click(object sender, System.EventArgs e)
        {
            SendFooCustomEvent(42);
        }
    
        ...
    }
    
    // the class that needs to be informed when the treeview changes
    //
    public class MyClient : ...
    {
        private MyClass form;
    
        private Init()
        {
           form.FooEvent += new MyClass.FooCustomEventHandler(On_FooCustomEvent);
        }
    
        private void On_FooCustomEvent(Object sender, FooEventArgs args)
        {
           // reorganize back end data here
        }
    
    }
    

    【讨论】:

    • 谢谢!这(一个完整的例子)正是我所需要的。稍微按摩一下,我就可以在我的应用程序的上下文中完成这项工作。
    【解决方案2】:

    一切都属于暴露事件的类:

    public event EventHandler Drop;
    
    protected virtual void OnDrop(EventArgs e)
    {
        if (Drop != null)
        {
            Drop(this, e);
        }
    }
    

    如果您有自定义的 EventArgs 类型,则需要使用通用的 EventHandler<MyEventArgs> 委托而不是 EventHandler

    还有什么你不确定的吗?

    【讨论】:

    • 感谢您的意见,这很有帮助。不幸的是,对我来说,穿过森林是不够的。我的错,不是你的……
    • -1:此代码不是线程安全的 - 如果在 if 之后未分配 drop,则将抛出 NullReferenceException。您应该首先将 Drop 事件分配给 EventHandler 委托。
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多