• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    asp.net 動態創建TextBox控件及狀態數據如何加載

    來源:懂視網 責編:小采 時間:2020-11-27 22:42:10
    文檔

    asp.net 動態創建TextBox控件及狀態數據如何加載

    asp.net 動態創建TextBox控件及狀態數據如何加載:接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎? 這里我們來說說狀態數據時如何加載的。雖然在Control中有調用狀態轉存的方法,但是這里有一個判斷條件 if (_controlState >= ControlState.ViewStateLoaded) 一般的g
    推薦度:
    導讀asp.net 動態創建TextBox控件及狀態數據如何加載:接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎? 這里我們來說說狀態數據時如何加載的。雖然在Control中有調用狀態轉存的方法,但是這里有一個判斷條件 if (_controlState >= ControlState.ViewStateLoaded) 一般的g

    接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎? 這里我們來說說狀態數據時如何加載的。
    雖然在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既沒有狀態信息,那也不需要加載什么狀態信息了。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    asp.net 動態創建TextBox控件及狀態數據如何加載

    asp.net 動態創建TextBox控件及狀態數據如何加載:接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎? 這里我們來說說狀態數據時如何加載的。雖然在Control中有調用狀態轉存的方法,但是這里有一個判斷條件 if (_controlState >= ControlState.ViewStateLoaded) 一般的g
    推薦度:
    標簽: 如何 狀態 控件
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: www亚洲欲色成人久久精品| 午夜福利麻豆国产精品| 欧美精品在线免费| 久久精品国产91久久综合麻豆自制 | 久久免费99精品国产自在现线| 国产成人精品日本亚洲直接| 亚洲国产欧美日韩精品一区二区三区| 国产精品 综合 第五页| 久久久久久久99精品免费观看| 国产乱码精品一品二品| 亚洲精品卡2卡3卡4卡5卡区| 日韩精品欧美| 精品人妻少妇一区二区三区在线 | 国产国产精品人在线观看| 亚洲中文精品久久久久久不卡| 久久久无码精品亚洲日韩软件| 国产精品欧美一区二区三区| 欧美精品高清在线观看| 国产在线精品一区二区不卡| 2021国产精品视频| 99国产欧美精品久久久蜜芽| 精品欧洲av无码一区二区| 久久久久亚洲精品天堂| 欧美日韩人妻精品一区二区在线| 亚洲国产精品无码久久九九| 毛片a精品**国产| 久久久久久久亚洲精品| 国产亚洲精品资在线| 国产精品亚洲产品一区二区三区 | 四虎国产精品永久在线观看| 亚洲精品无码专区久久久| 一本一道精品欧美中文字幕| 亚洲精品综合久久| 亚洲精品专区在线观看| 无码国产精品一区二区免费16| 久久久久久国产精品免费无码| 精品国际久久久久999波多野| 国产精品igao视频网网址| 国产成人精品天堂| 91人前露出精品国产| 国产女人18毛片水真多18精品 |