博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net 动态创建TextBox控件 如何加载状态信息
阅读量:4308 次
发布时间:2019-06-06

本文共 5140 字,大约阅读时间需要 17 分钟。

接着上文这里我们来说说状态数据时如何加载的。

虽然在Control中有调用状态转存的方法,但是这里有一个判断条件 if (_controlState >= ControlState.ViewStateLoaded)  一般的get请求这里的条件是不满足的。

internal enum ControlState

{
    Constructed,
    FrameworkInitialized,
    ChildrenInitialized,
    Initialized,
    ViewStateLoaded,
    Loaded,
    PreRendered
}

我们知道在page的ProcessRequest中this.ControlState = ControlState.FrameworkInitialized; ProcessRequestMain方法中在Init后有调用this.InitRecursive(null);在这个方法里面有这么一句_controlState = ControlState.Initialized;,在LoadAllState()方法中有这么一句 base.LoadViewStateRecursive(second.Second);,而LoadViewStateRecursive中又有_controlState = ControlState.ViewStateLoaded这句带代码,所以我们在Page_load中动态条件控件时, if (_controlState >= ControlState.ViewStateLoaded)条件成立,如图:

所以在运行this.form1.Controls.Add(txt);这句以前,txt的值为demo1,

如图

但是运行以后之就发生变化了:

当然这里的txt.Text值也是我上次post过来的旧值,新值是在控件的LoadPostData方法中重新绑定。在默认的LoadViewStateRecursive方法中有一个很重要的判断

        internal void LoadViewStateRecursive(object savedState) {

            // nothing to do if we have no state
            if (savedState == null || flags[disableViewState])
                return; 

。。。。。。。

_controlState = ControlState.ViewStateLoaded

            }

大家看到我上面是一个CustTextBoxt : TextBox控件,如果我们直接添加TextBox控件的话,那么着这里的txt.Text一直都是demo1,可见控件动态添加的时候是否加载状态数 据与状态数据的保存有关。而状态数据的保存主要就是SaveViewState完成的,这里我第一次post的时候SaveViewState返回数据:

所以第二次能取到上次post过来的数据。

其中与SaveViewState有关的方法主要有:

public class TextBox : WebControl, IPostBackDataHandler, IEditableTextControl {     protected override object SaveViewState() {            if (SaveTextViewState == false) {                ViewState.SetItemDirty("Text", false);            }            return base.SaveViewState();        }         private bool SaveTextViewState {            get {                //                 // Must be saved when                // 1. There is a registered event handler for SelectedIndexChanged                // 2. Control is not enabled or visible, because the browser's post data will not include this control                // 3. The instance is a derived instance, which might be overriding the OnTextChanged method                 if (TextMode == TextBoxMode.Password) {                    return false;                }                if ((Events[EventTextChanged] != null) ||                    (IsEnabled == false) ||                    (Visible == false) ||                    (ReadOnly) ||                    (this.GetType() != typeof(TextBox))) {                    return true;                }                 return false;            }        }     } public class WebControl : Control, IAttributeAccessor {      protected override object SaveViewState() {            Pair myState = null;             // Save values cached out of view state            if (_webControlFlags[disabledDirty]) {                ViewState["Enabled"] = !flags[isWebControlDisabled];            }            if (ControlStyleCreated) {                // the style shares the StateBag of its owner WebControl                // call SaveViewState to let style participate in state management                ControlStyle.SaveViewState();            }            object baseState = base.SaveViewState();            object aState = null;            if (attrState != null) {                aState = attrState.SaveViewState();            }            if (baseState != null || aState != null) {                myState = new Pair(baseState, aState);            }            return myState;        }}public class Control : IComponent, IParserAccessor, IUrlResolutionService, IDataBindingsAccessor, IControlBuilderAccessor, IControlDesignerAccessor, IExpressionsAccessor {      protected virtual object SaveViewState() {            // Save values cached out of view state            if (flags[visibleDirty]) {                ViewState["Visible"] = !flags[invisible];            }            if (flags[validateRequestModeDirty]) {                ViewState["ValidateRequestMode"] = (int)ValidateRequestMode;            }            if (_viewState != null)                return _viewState.SaveViewState();            return null;        }}public sealed class StateBag : IStateManager, IDictionary { internal object SaveViewState() {            ArrayList data = null;            if (bag.Count != 0) {                IDictionaryEnumerator e = bag.GetEnumerator();                while (e.MoveNext()) {                    StateItem item = (StateItem)(e.Value);                    if (item.IsDirty) {                        if (data == null) {                            data = new ArrayList();                        }#if OBJECTSTATEFORMATTER                        data.Add(new IndexedString((string)e.Key));#else                        data.Add(e.Key);#endif                        data.Add(item.Value);                    }                }            }            return data;        }    }

到这里我们知道保存状态信息主要是在StateBag SaveViewState方法中,这里有一个检查  if (item.IsDirty) ,在TextBox的SaveViewState方法中有一个判断

    if (SaveTextViewState == false) {

                ViewState.SetItemDirty("Text", false);
            } 

与它的SaveTextViewState 属性有关。

那么我们可以总结一下:动态创建的控件默认是在被添加的时候加载器状态数据,如果是静态添加的数据那就是LoadAllState来处理状态数据的加载。状态数据的加载与控件的SaveViewState密切相关,如果该方法的返回值为null既没有状态信息,那也不需要加载什么状态信息了

转载于:https://www.cnblogs.com/majiang/archive/2012/12/11/2813072.html

你可能感兴趣的文章
Python 环境搭建
查看>>
免费字典api ,查询汉字完整信息
查看>>
Flume协作框架
查看>>
基于数据库的事务消息解决分布式事务方案
查看>>
HDU 2461 Rectangles#容斥原理
查看>>
网口扫盲二:Mac与Phy组成原理的简单分析(转)
查看>>
使用最大似然法来求解线性模型(1)
查看>>
EF 从sqlserver2008 迁移到 2005出现的BUG
查看>>
架构-浅谈MySQL数据库优化
查看>>
jquery锚点连接划动滚动条,再也不用a标签name 了
查看>>
Apache JMeter--网站自动测试与性能测评
查看>>
信号与系统(中)
查看>>
【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用
查看>>
bash 快捷键
查看>>
检测登录按钮 ,回车即登录
查看>>
蓝桥杯-微生物增殖
查看>>
ansible for devops读书笔记第一章
查看>>
解决IE6下,给图片加上line-height属性不起作用的方法
查看>>
#10172. 「一本通 5.4 练习 1」涂抹果酱 题解
查看>>
vue-cli 3.0安装和使用
查看>>