C# 发起一项活动

C# 发起一项活动,c#,events,handler,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 eventvaluechan

我不能发起一个活动。这是我的密码。 我告诉它,我想知道的值是通过以下行更改的值:

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
我做错了什么

非常感谢。

这:

eventvaluechange.IntValue = value;//link value as the value I want to see change
不知道你认为它能做什么。
eventvaluechange.IntValue
value
之间没有链接,因为它涉及一种值类型,因此仅复制该值,不复制任何引用

为了实现这一点,您必须使用实例化的值保持器,
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();
}

这段代码似乎有点太多了

如果只是一个值在更改,您可能应该重新考虑您的攻击计划,并考虑实现INotifyPropertyChanged,如果它检测到更改,它将为您引发一个事件(您仍然需要对属性的setter进行一些操作,以使其真正起作用!)

如果你想继续进行一些容易进行的活动,我倾向于建立一个从未让我失望的寺庙:

公共事件处理程序值已更改

然后,如果值已更改,请调用: 值已更改?调用(此,e);(新的C#v6语法)

或使用自定义事件参数将新值传递回侦听器: 公共事件处理程序值已更改

然后打电话: ValueChanged?调用(此,新值args(newValue))

ValueArgs声明如下:

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

    public ValueArgs() { }
    public ValueArgs(int valueUpdated)
    {
        ValueUpdated = valueUpdated;
    }
}
如果您曾经手动分配事件:

eventvaluechange.ValueChanged+=新的EventHandler(ValueHasChanged)

然后不要忘记在表单关闭/处置时取消分配它

eventvaluechange.ValueChanged-=新的EventHandler(ValueHasChanged)


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

您是否尝试过一步一步地调试代码并查看发生了什么?寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现代码所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。是的,它从未进入intvalue。正在触发事件。很明显,否?您有问题的行将value的值指定给IntValue。你认为建立了什么联系?