ASP.NET动态创建文本框控件以及如何加载状态数据
那么,你真的知道Asp.net TextBox的TextChanged事件吗?我们来谈谈状态数据是如何加载的。Control中有调用状态翻转的方法,但如果(_ controlstate=controlstate则有判断条件。viewstateloaded ),并且常规get请求未得到满足。复制的代码如下:内部枚举控件状态{已构造,框架已初始化,子对象已初始化,已初始化,视图状态已加载,已加载,已预渲染}我们知道这一点。控制状态=控制状态。在页面的ProcessRequest中初始化了framework;ProcessRequestMain方法调用了此;init后的init recursive(null);在这个方法中,有这样一句话_ controlstate=controlstate。已初始化;在LoadAllState()方法中,有这样一个句子:base . Loadviewstaterercursive(second . second);并且短语_ control state=control state . viewstateadded在LoadViewStateRecursive中有一个代码,所以当我们在Page_load中对控件进行动态条件处理时,如果(_ control state=control state . viewstateadded)条件成立,如图所示:。
运行this . form 1 . controls . add(txt);之前txt的值是demo1,如图。
但是操作后就变了:。
当然,txt。这里的文本值也是我上次发布的旧值,新值正在控件的LoadPostData方法中重新绑定。在默认的LoadViewStateRecursive方法中,有一个非常重要的判断。复制的代码如下:内部void loadviewstaterecursive(对象已保存状态){//如果我们没有状态if(savedState==null | | flags[disableViewState])返回,则什么都不用做;_ control state=control state . view state loaded }如您所见,在我的上方有一个custTextBox:textbox控件。如果我们直接添加textbox控件,那么txt。此处的文本将始终为demo1。可见,控件动态添加时是否加载状态数据,关系到状态数据的保存。保存状态数据主要由SaveViewState完成。这里,我第一次发帖的时候,SaveViewState返回的数据是:。
所以第二次能取到上次邮政过来的数据。其中与保存视图状态有关的方法主要有:复制代码代码如下:公共类TextBox : WebControl,IPostBackDataHandler,IEditableTextControl {受保护的覆盖对象SaveViewState(){ if(SaveTextviewstate==false){ ViewState .setitemiddle(' Text ',false);}返回基地SaveViewState();}私有bool SaveTextViewState { get { ////必须在//1时保存选择索引已更改//2有一个已注册的事件处理程序。控件未启用或不可见,因为浏览器的帖子数据将不包括此控件//3。该实例是一个派生实例,如果(TextMode==TextBoxMode),它可能会重写OnTextChanged方法密码){返回false} if((eventsetchanged[EventTextChanged]!=null)| |(IsEnabled==false)| |(Visible==false)| |(ReadOnly)| |(这GetType()!=type of(TextBox))){ 0返回真}返回false} } }公共类WebControl : Control,IAttributeAccessor {受保护的覆盖对象SaveViewState(){ Pair myState=null;//在视图状态之外保存缓存的值,如果(_ webControlFlags[disabled dirty]){ ViewState[' Enabled ']=!标志[isWebControlDisabled];} if (ControlStyleCreated) { //该样式共享其所有者WebControl //的州袋,调用保存视图状态让风格参与状态管理ControlStyle .SaveViewState();}对象baseState=base .SaveViewState();对象aState=nullif (attrState!=null) { aState=attrState .SaveViewState();} if (baseState!=null || aState!=null){ MyState=new Pair(基本状态,Astate);}返回我的状态} }公共类控件:组件、IParserAccessor、IUrlResolutionService、IDataBindingsAccessor、IControlBuilderAccessor、IControlDesignerAccessor、IExpressionsAccessor {受保护的虚拟对象SaveViewState() { //如果(标志[visibleDirty]){视图状态[' Visible ']=!标志[不可见];} if(flags[validateRequestModeDirty]){ ViewState[' ValidateRequestMode ']=(int)ValidateRequestMode;} if (_viewState!=null) return _viewState .SaveViewState();返回null} }公共密封类StateBag : IStateManager,IDictionary {内部对象SaveViewState(){ ArrayList数据=null如果(包。数数!=0) { IDictionaryEnumerator e=bag .GetEnumerator();while(e . MoveNext()){状态项item=(状态项)(e . Value);如果(项目是脏的){ if(data==null){ data=new ArrayList();} # if OBJECTSTATEFORMATTER数据。添加(新的索引字符串((字符串)e . Key);#其他数据。添加钥匙;#endif数据。添加(项目。价值);} } }返回数据;} }到这里我们知道保存状态信息主要是在StateBag的保存视图状态方法中,这里有一个检查如果(项目. IsDirty),在文本框的保存视图状态方法中有一个判断复制代码代码如下: if(SaveTextviewstate==false){ ViewState .setitemiddle(' Text ',false);} 与它的保存文本视图状态属性有关。那么我们可以总结一下:动态创建的控件默认是在被添加的时候加载器状态数据,如果是静态添加的数据那就是LoadAllState来处理状态数据的加载。状态数据的加载与控件的保存视图状态密切相关,如果该方法的返回值为空既没有状态信息,那也不需要加载什么状态信息了。
版权声明:ASP.NET动态创建文本框控件以及如何加载状态数据是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。