代码之家  ›  专栏  ›  技术社区  ›  Javed Akram

如何创建自己的事件处理程序?

  •  1
  • Javed Akram  · 技术社区  · 14 年前

    我正在C中制作一个Windows窗体项目,在该项目中我制作了一个类 LabelX 继承的 System.Windows.Forms.Label ,然后添加属性 Mass 浮动型

    现在,我的问题是,当 质量 改变了。

    例如。:
    当用户输入值时 zero less than zero
    我想发出一个信息 “质量不能为零或负”

    5 回复  |  直到 14 年前
        1
  •  3
  •   Jeff Yates    14 年前

    如果我正确地解释了这一点,有两个部分。首先,您需要检测无效值并抛出异常。第二,当属性更改时需要引发事件。这可以通过以下方式实现。

    private float mass;
    public float Mass
    {
        get
        {
            return this.mass;
        }
    
        set
        {
            if (value <= 0.0F)
            {
                throw new ArgumentOutOfRangeException("Mass cannot be zero or negative.");
            }
    
            if (this.mass != value)
            {
                this.mass = value;
                OnMassChanged(EventArgs.Empty);
            }
        }
    }
    
    public event EventHandler MassChanged;
    
    protected virtual void OnMassChanged(EventArgs args)
    {
        var handler = this.MassChanged;
        if (handler != null)
        {
            handler(this, args);
        }
    }
    

    若要在输入无效项时显示消息,应将 try \ catch 阻止要设置的呼叫 Mass 抓住 ArgumentOutOfRangeException .

        2
  •  2
  •   Pieter van Ginkel    14 年前

    请尝试以下操作:

    // Created an empty form with a LabelX control on it.
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        // Added this event from the property manager.
        private void labelX1_MassChanged(object sender, EventArgs e)
        {
            var label = (LabelX)sender;
    
            if (label.Mass <= 0.0)
                MessageBox.Show("Mass is less than or equal to 0");
        }
    }
    
    public class LabelX : Label
    {
        private float _mass;
    
        public float Mass
        {
            get { return _mass; }
            set
            {
                if (!value.Equals(_mass))
                {
                    _mass = value;
                    OnMassChanged(EventArgs.Empty);
                }
            }
        }
    
        public event EventHandler MassChanged;
    
        protected virtual void OnMassChanged(EventArgs e)
        {
            if (MassChanged != null)
                MassChanged(this, e);
        }
    }
    
        3
  •  1
  •   Brian Driscoll    14 年前

    在Labelx类之外,创建以下类:

    public class MassChangedEventArgs : EventArgs
    {
       public float Mass { get; private set; }
    
       public MassChangedEventArgs(float mass)
       {
         this.Mass = mass;
       }
    }
    

    另外,在Labelx类之外,创建以下委托。这将是您的事件处理程序。

    public delegate void MassChangedEventHandler(object sender, MassChangedEventArgs e);
    

    在Labelx类中,创建要广播的事件:

    public class LabelX
    {
       public event MassChangedEventHandler MassChanged;
       //the rest of your code here...
    }
    

    您还需要创建一个将激发事件的私有实例方法。

    public class LabelX
    {
       public event MassChangedEventHandler MassChanged;
    
       private void OnMassChanged()
       {
           if(MassChanged!=null)
              this.MassChanged(this, new MassChangedEventArgs(this.Mass));
       }
       //the rest of your code here...
    }
    

    最后,当您的Mass属性发生更改时,调用OnMassChanged。例如:

    public class LabelX
    {
       private float mass;
       public float Mass
       {
           get
           {
             return mass;
           }
           set
           {
             mass = value;
             OnMassChanged();
           }
       }
    
       public event MassChangedEventHandler MassChanged;
    
       private void OnMassChanged()
       {
           if(MassChanged!=null)
              this.MassChanged(this, new MassChangedEventArgs(this.Mass));
       }
    
       //the rest of your code here...
    }
    

    当您希望基于每个实例处理该事件时,只需使用基础对象的massChanged事件注册一个侦听器,并执行任何必要的操作。

        4
  •  0
  •   Jeff Mercado    14 年前

    事件是框架中使用的常见模式。这个过程通常涉及到定义一个委托来用作事件处理程序,使用处理程序声明事件,定义方法来引发事件,然后连接到属性逻辑来引发事件。

    您描述的消息最好作为一个例外完成,但这里有一个示例来定义 MassChanged 事件。

    // Define event args if you have additional
    // information to pass to your event handlers
    public class MassChangedEventArgs : EventArgs
    {
        public MassChangedEventArgs(int oldMass)
        {
            OldMass = oldMass;
        }
        public int OldMass { get; private set; }
    }
    
    public class SomeObject
    {
        // There's a generic event handler delegate that can be
        // used so you only need to define the event arguments.
        public event EventHandler<MassChangedEventArgs> MassChanged;
    
        // Convenience method to raise the event
        protected virtual void OnMassChanged(MassChangedEventArgs e)
        {
            if (MassChanged != null)
                MassChanged(this, e);
        }
    
        public int Mass
        {
            get
            {
                return mass;
            }
            set
            {
                // Your checks here
                if (value <= 0)
                    throw new ArgumentOutOfRangeException("Mass", "Mass can't be zero or negative");
                // Should only raise the event if the new value is different
                if (value != mass)
                {
                    // Change the mass
                    MassChangedEventArgs e = new MassChangedEventArgs(mass);
                    mass = value;
                    // Raise the event
                    OnMassChanged(e);
                }
            }
        }
    
        private int mass;
    }
    

    之后,只需注册事件的处理程序并从那里开始。

        5
  •  0
  •   ivo s    14 年前

    我很确定你会“解雇”你的案子中的一个例外。 这更多的是验证逻辑问题,比如AOP代码契约概念。

    但是如果你真的想为它创建一个活动,你必须至少: 1)在Label类中创建一个事件存储变量

      public event EventHandler MassChanged;
    

    2)在您的财产中(请注意,您失去了使用C 3的代码生成函数的能力 哪个“自动”实现字段来存储您的质量属性值)

     public bool Mass
            {
                get { return _mass; }
                set { 
                      // check if value is invalid (0 or less) && that event subscribers exist
                      if(value<=0 && MassChanged != null) { MassChanged(this, null); }
                      else // otherwise assign ...
                      {  
                      _mass = value; 
                      }                
    
                    }
            }
    

    3)创建类型为的事件处理程序 EventHandler

    最好阅读有关事件的msdn文章: link text

    同样,我很确定你没有在应用程序中正确地处理异常。 如果你需要一个活动。我的意思是没有什么不对劲,但事情是 通常不作为价值验证的手段。