本人刚转向C#,对这一句“bnCtoF.Click += new EventHandler(this.bnCtoF_Click);”不理解,请高手讲讲。
“+=”的作用和意义是什么?是累加吗?
“bnCtoF.Click”的“Click”表示事件吗?事件能累加吗?
问题点数:20、回复次数:12Top
1 楼foyuan(暴走零零漆)回复于 2004-12-03 18:53:10 得分 0
事件只能这样赋值
确切的说应该是一种代理
事件是建立在代理上面的,一般是EventHandler代理,所以给事件赋值的时候就必须赋上一个EventHandler类型
因此用new EventHandler()表达式
因为事件是一种代理,代理是通过委托一个函数执行的,委托的时候必须用+=,所以...Top
2 楼51106354(大头)回复于 2004-12-03 18:54:04 得分 0
+= 为特殊操作符,在定义事件时使用此方法.
详细你可以看看委托或事件定义
bnCtoF.Click 表示为此控件的Click事件,当然前提是此控件要支持Click事件
事件不能累加,但事件可以调用事件Top
3 楼kangxidadi(康熙大帝)回复于 2004-12-03 19:00:39 得分 0
楼上讲的不知所云。
click是事件,+=用于订阅事件处理方法,-=用于取消订阅,+=右边必须是一个与具有相同类型的代理,未必要new出来的。
你可以把+=当作累加,标题中的代码执行两次之后,以后发生click事件会执行两次bnCtoF_Click方法。这是后要取消的话必须执行与+=相等次数的-=.Top
4 楼ysjfirst()回复于 2004-12-03 19:00:48 得分 0
+=是对应于事件的专有运算符,与之相对应的还有-=;
+=就是使把相相应的方法对应到事件触发对象上
-=取消这种对应Top
5 楼flame_qin(flame)回复于 2004-12-03 19:18:19 得分 0
建议认真学习C#语法中的“委托和事件”
“委托”在不同的书中可能有不同的叫法,如:“委派”、“指代”等等。Top
6 楼yanransoft()回复于 2004-12-03 20:15:45 得分 0
给bnCtoF对象的click事件关联一个事件处理方法bnCtoF_Click
bnCtoF.Click += new EventHandler(this.bnCtoF_Click);”Top
7 楼ymk(yanghao)回复于 2004-12-03 20:28:10 得分 0
yanransoft() 的总结有些味道,我闻到了一点,请诸位高手继续教我...Top
8 楼zhoutler(一代程序巨浆--用浆糊粘贴别人代码巨厉害)回复于 2004-12-03 21:42:54 得分 0
看看C#的语法规范:
事件申明可以包含访问器的声明.如果省略...
事件可用于+=和-=运算符的左操作符....而该事件的访问修饰符控制该运算的上下文。
在型如:x+=y和x-=y的运算中,如果x是一个事件,而且该引用发生在声明了x事件的类型之外,则这种...此规则能够禁止外部代码以....
太多了。难得打,看看Anders Hejlsberg自己出的C#语法规范。Top
9 楼zhoutler(一代程序巨浆--用浆糊粘贴别人代码巨厉害)回复于 2004-12-03 21:46:15 得分 0
居然有人说-=和+=是专门用于事件的操作符?Top
10 楼alias88()回复于 2004-12-03 22:02:00 得分 0
居然有人说-=和+=是专门用于事件的操作符?
居然有人说事件不能累加
事件也是有get,set方法的,+= -=只是操作符重载,
设置事件调用就是将委托加到事件列表中,引发事件时历遍列表一一调用委托而已
不一定是new的,比如你可以将所有菜单单击事件定向到一个委托
+= -= 要用好,不然可能会一个委托被调用多次而你不想Top
11 楼alias88()回复于 2004-12-03 22:29:53 得分 0
举一套例子:
//定义事件句柄
public delegate void RowUpdateHandler(object Sender,RowUpdateEventArgs e);
--------------------------
定义事件
[
Category("数据更新"),
Description("在更新表的每一个更改行完毕时发生")
]
public event RowUpdatingHandler RowUpdated;
--------------------------
//定义事件要使用的参数类
public class RowUpdateEventArgs:System.EventArgs
{
public DataRow UpdateDataRow;
public SqlCommand Command;
public System.Data.SqlClient.SqlTransaction Transaction;
public bool CancelUpDate;
public RowUpdateEventArgs(DataRow pUpdateDataRow,SqlCommand pCommand, SqlTransaction pTransaction , ref bool pCancelUpDate ):base()
{
UpdateDataRow=pUpdateDataRow;
Command=pCommand;
Transaction=pTransaction;
CancelUpDate=pCancelUpDate;
}
}
--------------------------
--------------------------
//引发事件
protected void OnRowUpdating(DataRow pDR,SqlCommand pCMD, SqlTransaction pTransaction)
{
bool Cancle=false;
if(RowUpdating !=null)
RowUpdating(this,new RowUpdateEventArgs(pDR,pCMD,pTransaction,ref Cancle));
if (Cancle)
pTransaction.Rollback();
else
pTransaction.Commit();
}
--------------------------以上都在一个类里面定义,假设是myForm
///事件处理(可能在另一个类)
public class xxxxx : myForm
{
xxxxx()
{
//预订事件
base.RowUpdated+= new RowUpdateHandler(rowupdate);
}
private rowupdate(object sender,RowUpdateEventArgs e)
{
//事件处理
....
}
}
Top
12 楼liangshutao()回复于 2004-12-24 15:49:00 得分 20
yanransoft() 的总结Top




