读书人

如何写一个自定义事件

发布时间: 2012-01-13 22:43:29 作者: rapoo

怎么写一个自定义事件
public class MyClass
{
private int stauts =0;

public int Stauts
{
get{return status;}
set{status = value;}
}
}

这是我的类,里面有个属性,
我要当属性的值改变时触发事件,对其值作出判断,然后再作相应处理。
这个事件怎么写?请大家指点。


[解决办法]
private void OnStart(object sender, EventArgs value)
{
if (Start != null)
{
Start(sender, value);
}
}

public event StartEventHandler Start;

public int Stauts
{
get{return status;}
set{status = value;
OnStart(this, new EventArgs());
}
}



[解决办法]
public class MyClass
{
//定义事件参数
public class ValueSettingEventArgs : EventArgs
{
private int m_Value;
private bool m_cancel;
public ValueSettingEventArgs(int value)
{
this.m_Value = value;
}
public int Value
{
get
{
return this.m_Value;
}
}
public bool Cancel
{
get
{
return this.m_Value;
}
set
{
this.m_Value = value;
}
}
}
private int stauts = 0;
//声明事件
public event EventHandler <ValueSettingEventArgs> ValueSetting;
public int Stauts
{
get { return status; }
set
{
if (status != value)
{
if (ValueSetting != null)
{
ValueSettingEventArgs args = new ValueSettingEventArgs(value);
ValueSetting(this, args);//引发自定义事件
if (args.Cancel)
{
return;
}
}
status = value;
}
}
}
}

[解决办法]
这个需求很有普遍性,因此MS定义了一个接口:INotifyPropertyChanged。
lz只需要定义一个PropertyChangedEventHandler PropertyChanged就可以,而且用在控件绑定的时候会大大减轻你的工作,因为这是MS“官方”承认的接口。

[解决办法]
//定义一个委托,一定要类写在外面
public delegate void EventHandlerStautsChanged(int Costs);//+
public class MyClass
{
//定义事件
public event EventHandlerStautsChanged StautsChanged;//+

private int stauts =0;

public int Stauts
{
get{return status;}
set{
status = value;
//触发事件
if (null!=StautsChanged) //+
StautsChanged(status ); //+
}
}
}

//外部调用
MyClass实列.StautsChanged+= new EventHandlerStautsChanged(this.StautsChanged);
private void StautsChanged(int Stauts)
{
//加入自己的应用
}


[解决办法]

若还有别的地方能使Stauts改变

在你对Stauts 能改变的地方加上事件的应用即可
[解决办法]
mark
[解决办法]
不知道danjiewu(阿丹)说的是不是属实,我在vs2003中是没有找到这个接口。
我自己的做法就是在set中调用一个事件处理方法。
[解决办法]
mark
------解决方案--------------------


INotifyPropertyChanged确实是2.0才有的。
如果是2003的话就自己定义一个事件好了。
public class Sample
{
private int status;

public int Stauts
{
get { return status; }
set
{
if (status != value)
{
status = value;
OnPropertyChanged( "Status ");
}
}
}

public event PropertyChangedHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedArgs(propertyName));
}
}
}

public delegate void PropertyChangedHandler(object sender,PropertyChangedArgs args);

public class PropertyChangedArgs : EventArgs
{
public PropertyChangedArgs() { }

public PropertyChangedArgs(string propertyName) { this.propertyName = propertyName; }

private string propertyName;

public string PropertyName
{
get { return propertyName; }
set { propertyName = value; }
}
}

读书人网 >C#

热点推荐