当前位置 > 首页 > 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


  • Spring.NET学习笔记6——依赖注入(应用篇)

    2009-10-26 23:43:00

    阅读: 32 评论: 2 作者: 落花吹雪 发表于 2009-10-26 23:23 原文链接   谈到高级语言编程,我们就会联想到设计模式;谈到设计模式,我们就会说道怎么样解耦合。而Sp

  • 是做草根,还是做贵族?

    2010-1-20 16:44:00

    阅读: 650 评论: 0 作者: 野男人 发表于 2010-01-20 13:36 原文链接 当前处在第一阵营的视频网站都是把自己定位成一种新媒体,这是很正确合理的一个选择,因为互联

  • .net自动更新组件Ant

    2012-8-8 22:28:00

    Ant是基于Beetle实现开源的自动更新工具,主要包括三大部分:网络文件服务,文件更新管理和客户端更新组件. 网络文件服务 服务端主要用于文件管理,包括文件上传和下载。服务在开启的

  • 《Microsoft Sql server 2008 Internal》读书笔记--第三章Databases and Database Files(1)

    2010-1-19 15:51:00

    阅读: 397 评论: 4 作者: 邀月 发表于 2010-01-19 12:27 原文链接 最近断断续续看《Microsoft Sql server 2008 Internal》,中文名

  • VS2005打开项目无响应,和CSC.exe进程有关?

    2007-6-13 10:11:00

    我的VS2005老是在每天第一次打开项目时,就会无响应,只好强制结束进程,然后再打开打开该项目,就一切顺利了。只是在用VSS时,要就要求VSS管理员修复数据库,很是郁闷。所以,自己只好每天打开一个C

  • 张无忌与.NET

    2012-4-14 18:39:00

    张无忌与.NET 首先,不得不承认而且必须得承认的是:任何一门学科的学好、学成、乃至精通必须经历一段艰苦难忘的学习工作岁月。这点毋庸置疑:.NET也不例外。 这几天我

  • 也谈WEB打印(二):简单的分析一下IE的打印原理并实现简单的打印和预览

    2007-10-10 11:29:00

    摘要: 在《也谈WEB打印(-):目前的几种方式及我们的任务》中,分析了一下当前Web打印的几种方式以及我们所遇到的问题,并提出了我们的要求,本文简单的分析一下IE的打印原理,并实现简单的打印和预览

  • Splash窗体(ProgressWindowForm修改)

    2009-11-30 17:34:00

    阅读: 21 评论: 0 作者: 萧萧空间 发表于 2009-11-30 17:11 原文链接 上篇中写了一个ProgressWindowForm窗体,主要使用线程来处理系统中执行的

  • 对于校内网的消息提醒功能的想法 (2)

    2009-10-10 13:00:00

    摘要: s之前的文章提到了一些想法,最忠实的是轮询ajax,每秒钟发送一次请求。同时,有高手提出了comet,jms等先进方法。只是我看了一些关于这些技术的文章,自己还没有达到能应用的程度。只是今天

  • [翻译]使用表达式树获取对象、类型和成员的信息

    2010-3-8 13:11:00

    阅读: 914 评论: 4 作者: 甜番薯 发表于 2010-03-07 21:10 原文链接 原文来自 Alexandra Rusina在 CSharpFAQ