发射一个事件

时间:2017-02-03 15:16:25

标签: c# events handler

我无法举办活动。这是我的代码。 我告诉它我想要知道的值改变是这行的值:

eventvaluechange.IntValue = value;//link value as the value I want to    see change

然后我告诉当价值变化发生时会发生什么。

public partial class Form1 : Form
{
    int value=0;
    int value2=999;
    Val_changeInt eventvaluechange;
    public Form1()
    {
        InitializeComponent();
        eventvaluechange = new Val_changeInt();
        eventvaluechange.IntValue = value;//link value as the value I want to see change
        eventvaluechange.ValueChanged += new EventHandler(ValueHasChanged);//what I do on event
    }
    private void button1_Click(object sender, EventArgs e)
    {
        value = value +1;
    }
    private void ValueHasChanged(object sender, EventArgs e)
    {
        value2 = value;
        label1.Text = value2.ToString();
    }
    class Val_changeInt
    {
        private int valueToWatchOn;
        public event System.EventHandler ValueChanged;
        protected object _lock = new object();
        protected virtual void ValueHasChanged()
        {
            EventHandler eventvaluechange = ValueChanged;
            if (eventvaluechange != null) eventvaluechange(this, EventArgs.Empty);
        }
        public int IntValue
        {
            get { return this.valueToWatchOn; }
            set
            {
                if (value != this.valueToWatchOn)
                {//if value changed enter
                    this.valueToWatchOn = value;
                    ValueHasChanged();
                }
            }
        }
    }//Event handler for a value change

我做错了什么?

非常感谢。

2 个答案:

答案 0 :(得分:2)

此:

eventvaluechange.IntValue = value;//link value as the value I want to see change

不是你认为它做的。 eventvaluechange.IntValuevalue之间没有链接,因为它涉及值类型,因此只是复制了值,没有复制引用。

要使其工作,您必须使用已实例化的值持有者eventvaluechange,因为该实例包含将在值更改时触发事件的值。像这样:

private void button1_Click(object sender, EventArgs e)
{
    eventvaluechange.IntValue = eventvaluechange.IntValue + 1;
}
private void ValueHasChanged(object sender, EventArgs e)
{
    value2 = eventvaluechange.IntValue;
    label1.Text = value2.ToString();
}

答案 1 :(得分:1)

这段代码似乎有点太多了!

如果它只是单个值发生变化,你应该重新考虑你的攻击计划,并考虑实施INotifyPropertyChanged,如果它发现了变化,你将为你举起一个事件(你还需要做一些工作)对于这个实际工作的物业的设定者!)。

https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

如果你想继续进行那些容易开展的活动,我倾向于在一座永不失败的寺庙里工作:

公共事件EventHandler ValueChanged;

然后值已更改,请致电: ValueChanged?.Invoke(this,e); (新的C#v6语法)

或使用自定义事件args将新值传递回侦听器: 公共事件EventHandler ValueChanged;

然后致电: ValueChanged?.Invoke(this,new ValueArgs(newValue));

ValueArgs声明为:

public class ValueArgs : EventArgs
{
    public bool ValueUpdated { get; set; }

    public ValueArgs() { }
    public ValueArgs(int valueUpdated)
    {
        ValueUpdated = valueUpdated;
    }
}

如果您手动分配事件:

eventvaluechange.ValueChanged + = new EventHandler(ValueHasChanged);

然后在表格关闭/处理时不要忘记取消分配!

eventvaluechange.ValueChanged - = new EventHandler(ValueHasChanged);

因为如果你忘记了这些通常会导致内存泄漏!!!