posts - 17,  comments - 28,  trackbacks - 0

今天接到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)  编辑 收藏 引用 所属分类: 技术点滴

专题:Android  iPad jQuery Chrome OS

博客园首页  IT新闻  知识库  学英语  C++程序员招聘
标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
每天10分钟,轻松学英语
网站导航: