当前位置 > 首页 > Asp.net

Asp.net TextBox的TextChanged事件你真的清楚吗?

2012-12-10 16:39:00来源:Asp.net

在博客园里有位兄弟问了我一个问题,动态创建的控件是如何加载视图状态,还提到ProcessPostData方法的调用。这里我就用TextBox的TextChanged事件来说说视图数据的加载以及事件的触发。

我们首先还是来看一个demo吧:

代码如下:

运行结果如图:

现在我们来修改文本框的值,然后点击按钮提交页面,看看有什么事情发生

TextBox的TextChanged事件这时候发生了,运行结果如图:

现在我们什么也不做,再次点击按钮提交,看看会有什么效果:

这是为什么了,TextBox的TextChanged事件这时候没有触发

大家是否知道TextBox的TextChanged事件触发的条件了,那好我们今天就一起来看看该事件是如何触发的。

这里我们首先来看看TextBox的定义:

public class TextBox : WebControl, IPostBackDataHandler, IEditableTextControl, ITextControl

public interface IPostBackDataHandler
{
    bool LoadPostData(string postDataKey, NameValueCollection postCollection);
    void RaisePostDataChangedEvent();
}
public interface IEditableTextControl : ITextControl
{
    event EventHandler TextChanged;
}
public interface ITextControl
{
    string Text { get; set; }
}
这里我们最主要的是关注IPostBackDataHandler接口的实现,

protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
        base.ValidateEvent(postDataKey);
        string text = this.Text;
        string str2 = postCollection[postDataKey];

        if (!this.ReadOnly && !text.Equals(str2, StringComparison.Ordinal))
        {
            this.Text = str2;
            return true;

        }
        return false;
    }
    
      protected virtual void RaisePostDataChangedEvent()
    {
        if (this.AutoPostBack && !this.Page.IsPostBackEventControlRegistered)
        {
            this.Page.AutoPostBackControl = this;
            if (this.CausesValidation)
            {
                this.Page.Validate(this.ValidationGroup);
            }
        }
        this.OnTextChanged(EventArgs.Empty);
    }

这里的RaisePostDataChangedEvent方法比较好理解,主要就是调用TextChanged事件方法,而LoadPostData方法中是可以取到textBox当前值(旧值 string text = this.Text;)和post过来的新值( postCollection[postDataKey]),如果当前textbox不是只读,并且新旧值不等的话,则吧新值赋给textbox的text属性,返回true,否者返回false,这里我们能否猜测textbox的LoadPostData返回true,我们才调用RaisePostDataChangedEvent方法。

在前面的asp.net Page事件处理管道我们曾经提到两段比较特殊的代码,一段是处理IPostBackDataHandler一段是处理IPostBackEventHandler
首先我们还是来先看看

  this.OnInitComplete(EventArgs.Empty);

 if (context.TraceIsEnabled)
            {
                this.Trace.Write("aspx.page", "End InitComplete");
            }
            if (this.IsPostBack)
            {
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "Begin LoadState");
                }
                this.LoadAllState();
                if (context.TraceIsEnabled)
                {
                    this.Trace.Write("aspx.page", "End LoadState");
                    this.Trace.Write("aspx.page", "Begin ProcessPostData");
                }
                this.ProcessPostD


  • MVC项目在IIS6上部署的几种思路

    2009-11-3 17:21:00

    阅读: 113 评论: 1 作者: 邀月 发表于 2009-11-03 16:41 原文链接 微软在vista和win2008下集成了IIS7,与IIS6相比,有重大升级,看IIS7的十大

  • Load Resource Dictionaries at Runtime in WPF

    2009-12-1 18:35:00

    One of the really cool features of WPF is the ability to style controls. Styles in WPF can be group

  • VS C#基础25FAQ

    2009-10-4 1:30:00

    摘要: 1.静态变量和非静态变量的区别? 答:静态变量:静态变量使用static修饰符进行声明,在所属类被装载时创建,通过类进行访问,所属类的所有实例的同一静态变量都是同一个值 非静态变量:不带有s

  • 折腾词库,一个词库互转程序

    2010-3-3 12:03:00

    阅读: 740 评论: 1 作者: 深蓝 发表于 2010-03-02 20:41 原文链接 我在之前写过一个小程序,用于实现QQ拼音、搜狗拼音、谷歌拼音和百度手机拼音输入法词库的互转,文

  • Script.Aculo.Us开发系列(一):起步

    2007-9-13 22:08:00

    Script.Aculo.Us 开发系列是我最近的一些新的发现,在这个系列中,我将会和大家一起分享自己在Script.Aculo.Us中的开发经验,由于目前中文的相关资料还很少,希望能尽绵薄之力吧,

  • ASP.net 的工作线程与请求队列

    2009-3-21 11:58:00

    ASP.net工作线程池 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程。 一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理

  • 【ASP.NET】困扰我多年的URL参数设置问题

    2011-3-9 13:02:00

    URL参数一直以来困扰着我。始终没有一个完美的解决方案!考虑到网页的安全性有些地方不得不做以限制。由于本身对这个地方没有经验,所以前来问问各路高手 你们是怎么处理这个问题的。我把我所遇到的问题说一下

  • 扩展URL Routing:处理URL中的日期参数

    2009-6-5 16:06:00

    对URL中的日期参数,老赵提供了一个非常经典的 解决方案 。但是这里的日期参数是以yyyy-MM-dd的形式出现的,用户往往会有这样的需求,即URL中的参数一定要为Demo/Date/2009/06

  • How to makeuse of IsPostPack Method inside UserControl?

    2007-9-27 0:49:00

    How to makeuse of IsPostPack Methodinside UserControl? IsPostBack method will always be true ins

  • UpdatePanel PDF updated for ASP.NET Ajax 1.0

    2007-3-15 4:09:00

    The PDF document that I wrote with Matt Gibbs a while ago on UpdatePanel is now up to date and