今天接到leader布置的一个任务,从TextBox继承一个新的控件并为其增加一些功能,其中一个功能如下:
Add a property: FormatString, when the text box lost focus, the content will be replace with string.Format(FormatString, actualContent),我在做第二个:“当textbox失去焦点时自动格式化文本”的地方遇到了问题。。。
简单起见,简化成“当textbox失去焦点时改变文本内容”。
一种方法是:
重写OnLeave()方法,如下:
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
this.Text = "Override OnLeave";
}
另一种是给Leave事件增加一个订阅者:
private void NewReceiver(object sender, EventArgs e)
{
this.text = "NewReceiver";
Invalidate();
}
//constructor
public MyTextBox()
{
this.Leave += new EventHandler(NewReceiver);
}
经测试,均可运行。
现在,把两段代码和在一起,并注释掉第一种方法:
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
//this.Text = "Override OnLeave";
}
private void NewReceiver(object sender, EventArgs e)
{
this.text = "NewReceiver";
Invalidate();
}
//constuctor
public MyTextBox()
{
this.Leave += new EventHandler(NewReceiver);
}
运行程序,测试,显示NewReceiver。
接下来再把base.OnLeave(e)注释掉:
protected override void OnLeave(EventArgs e)
{
//base.OnLeave(e);
//this.Text = "Override OnLeave";
}
private void NewReceiver(object sender, EventArgs e)
{
this.text = "NewReceiver";
Invalidate();
}
//constuctor
public MyTextBox()
{
this.Leave += new EventHandler(NewReceiver);
}
运行,发现文本框失去焦点后不会改变内容,仍未空。由此,第二种方法失效了。为何?我们来看一下base.OnLeave()的内容:
protected virtual void OnLeave(EventArgs e)
{
EventHandler handler = (EventHandler) base.Events[EventLeave];
if (handler != null)
{
handler(this, e);
}
}
原来,注释掉这段以后,handler(this, e)无法得到执行,也就没法激发事件,文本框内容当然也就没法改变了。
由此,我猜测,C#的事件触发过程大致是这样的:
文本框失去焦点 --> 触发Leave事件 --> 调用OnLeave()函数(这里是因为什么机制调用的?) --> 调用base.OnLeave() --> 再次触发Leave事件 --> 调用NewReceiver() --> 返回,执行this.text = "Override OnLeave"。
红色字,大家谁知道的,帮我解个惑吧~~
posted on 2008-08-07 19:22
彭小虎(Tigerkin) 阅读(59)
评论(0) 编辑 收藏 引用 所属分类:
技术点滴