当前位置 > 首页 > Asp.net

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

12/10/2012 4:39:00 PM来源: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


  • 来谈谈MRO

    8/11/2009 11:22:00 PM

    什么是MRO?呵呵,在这里所说的MRO可不是指MBA里的Maintenance、Repair and Operations(工作设施、设备进行保养、维修),而是我自己缩写的一个名词。现在到处都是简写

  • 业务工作流平台设计(四)

    5/22/2007 10:49:00 AM

    摘要: 这一小节要讲的东西,目前我认为是最重要的东西。这是业务工作流平台中非常重要的一部分;;也是模板的重要组成部分。我们将从以下几个方面讲述自定义活动: l 尽可能减少占有时间 l

  • Gridview,datalist,repeater数据绑定控件使用说明

    2/6/2009 1:33:00 AM

    摘要: Gridview,datalist,repeater三者的使用说明 阅读全文 -------------------------- 新闻: 商业周刊:微软面临谷歌Android严

  • Migration & Modernization: Windows/VB6 Apps to ASP.NET HTML5

    4/1/2012 9:30:00 PM

    I would like to invite you to a webinar we are doing in collaboration with Jeffrey S. Hammond , Pri

  • Visual Studio调试之断点进阶篇

    9/27/2009 2:43:00 PM

    摘要: 在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CP

  • VTemplate模版引擎的使用--认识篇

    8/27/2009 6:52:00 PM

    摘要: VTemplate是一个免费的开源(采用LGPL开源许可协议)模板引擎,用于解析运行VT模板; 其主要目标是为ASP.Net开发提供另外一种技术选择方案,以保证用简单的语法,良好的结构,不混

  • Silverlight 3 DataGrid Columns Grouping using PagedCollectionView

    8/1/2009 9:30:00 PM

    In this post I am showing how to implement Column Grouping in SIlverlight 3 DataGrid, Before st

  • 安装Windows Mobile 6 Professional(Standard) SDK Refresh错误 -- Error 2738

    11/21/2009 3:09:00 PM

    阅读: 54 评论: 0 作者: 李森 - listen 发表于 2009-11-21 14:23 原文链接 今天重装系统,在成功安装了 Windows Mobile 6 Prof

  • [翻译]ASP.NET MVC 3 开发的20个秘诀(十四)[20 Recipes for Programming MVC 3]:使用Ajax提交Form

    12/18/2011 8:04:00 PM

    议题 当你有一个页面,其中列出重要细节并希望用户可以快速而方便的填写并提交表单,而不需要重新载入整个页面,或在网站上跳转而失去当前导航的页面。 解决方案 使用 A

  • IT项目经理经验谈 - 如何谈判

    9/21/2009 1:47:00 PM

    摘要: 提到谈判,很多IT项目经理会说“跟我无关,是高层的事情。”那么你错了,谈判不一定是和商务合作伙伴公司,其实谈判无处不在,你需要和你的团队成员判断例如加班,赶进度,讨论