触发事件
Firing an event
我无法触发事件。这是我的代码。
我告诉它我想知道更改的值是此行的值:
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
之间没有 link,因为它涉及 value-type,因此只是复制了值,没有复制引用。
要实现此功能,您必须使用已实例化的 value-holder 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();
}
这段代码似乎有点太多了!
如果只是单个值发生变化,您也许应该 re-think 您的攻击计划并考虑实施 INotifyPropertyChanged,如果它检测到更改,它将为您引发一个事件(您仍然需要在 属性 的 setter 上做一些工作才能真正起作用!)。
https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx
如果你想继续那些很容易开始的活动,我倾向于在一个永远不会让我失望的寺庙工作:
public 事件 EventHandler ValueChanged;
然后在值发生变化的地方调用:
ValueChanged?.Invoke(this, e); (新的 C# v6 语法)
或使用自定义事件参数将新值传递回侦听器:
public 事件 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);
然后不要忘记在表单为 closed/disposed!
时取消分配
eventvaluechange.ValueChanged -= new EventHandler(ValueHasChanged);
因为如果你忘记了这些通常会导致内存泄漏!!!
我无法触发事件。这是我的代码。 我告诉它我想知道更改的值是此行的值:
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
之间没有 link,因为它涉及 value-type,因此只是复制了值,没有复制引用。
要实现此功能,您必须使用已实例化的 value-holder 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();
}
这段代码似乎有点太多了!
如果只是单个值发生变化,您也许应该 re-think 您的攻击计划并考虑实施 INotifyPropertyChanged,如果它检测到更改,它将为您引发一个事件(您仍然需要在 属性 的 setter 上做一些工作才能真正起作用!)。
https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx
如果你想继续那些很容易开始的活动,我倾向于在一个永远不会让我失望的寺庙工作:
public 事件 EventHandler ValueChanged;
然后在值发生变化的地方调用: ValueChanged?.Invoke(this, e); (新的 C# v6 语法)
或使用自定义事件参数将新值传递回侦听器: public 事件 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);
然后不要忘记在表单为 closed/disposed!
时取消分配eventvaluechange.ValueChanged -= new EventHandler(ValueHasChanged);
因为如果你忘记了这些通常会导致内存泄漏!!!