pageload 重新生成動態控制項的問題

2022-03-24 01:41:43 字數 2201 閱讀 5863

今天看一段程式碼,發現對asp.net頁面週期還是不熟悉:

<%@ page language="

c#" %>

"-//w3c//dtd xhtml 1.0 transitional//en""

">"

">

當我點選按鈕的時候(按鈕沒有任何事件處理**),頁面被postback

而由於page_load()中設定了if (!page.ispostback),所以這兩個控制項並沒有被重新建立

我想問一下,應該如何保持住這兩個控制項的狀態呢?

重新建立一次控制項應該不是很好的方法,因為所有控制項的資料都要重新繫結,在我這邊要動態建立很多這樣的控制項,並且還要做很多從資料庫提取並繫結資料的動作

是否能夠在控制項第一次被動態建立的時候就使用viewstate或其他方法將他們保持住呢?

請大家指點

首先必須去掉 ispostback 的判斷你的程式才能正確執行。

為什麼那些asp.net入門書上有很多例子在page_load裡邊寫ispostback 判斷呢?因為asp.net首先將在頁面設計器上寫的那些控制項裝入頁面,然後才執行page_load也就是執行那些賦值踰矩。而你的**是建立控制項之後首先賦值,然後才裝入頁面。

當你把控制項裝入頁面的時候,asp.net會自動將thelabel、thetb的狀態(例如你原來設定的字型、背景色、內容等等)以及客戶端提交的客戶輸入的內容給你「回填」到控制項上,並且準備好觸發應該觸發事件(在page_load結束之後就會觸發)。因此,你對thelabel、thetb的改變會被asp.net重新整理,不寫ispostback也根本不會出錯。反而,如果你寫了ispostback,asp.net根本無法在頁面回發的時候在同樣位置找到thelabel、thetb控制項了,當然無法回填任何資料。

那麼那些入門書上的那種**,是在asp.net對控制項處理完(新增入頁面)之後,因此你寫的**會重新整理asp.net回填的值,因此需要ispostback來決定到底維持哪乙個值。

而對於datagrid(gridview)等,由於它在狀態中根本不保持資料內容(textbox會自動保持text屬性,但是**並不自動保持內容資料,這是有差別的),所以比必須重新繫結資料,這也是一種不能使用ispostback的情況。

最後,要想在說清楚一些,我把你的**用asp.net處理設計器上控制項的那種固有的那種邏輯改一下(我沒有測試是否正確,你理解意思就好):

protected

void page_load(object

sender, eventargs e)

}

順便說一下,看上去這個問題解決了。但是實際上這並沒有透徹解決asp.net軟體設計問題。

好的、可以長期利用的軟體是元件化的,而不是按照頁面來設計的。通常對一些資料來源(例如乙個sql語句或者乙個資料庫記錄的主鍵值)輸入引數設計一些應用控制項,例如根據「欄目」的id號自動產生本欄目的導航列表,並且根據乙個「風格」引數生成橫向、縱向、平鋪、樹形等多種形式,這種應用控制項才是軟體ui設計的真正核心技術,是你公司產品背後的真正英雄。當你需要寫乙個頁面的時候,把業務控制項拿過來根據使用者的喜好隨意擺放、設定一下簡單的幾個引數,乙個應用程式應該在十幾分鐘之內產生出來。

這時候,控制項裝入資料的時機根本不能考慮放到page_load中去。而是要根據控制項的機制去設計。

我現在如果正規地去寫個商業程式,已經幾乎根本不在頁面上放任何東西,整個頁面中僅僅放乙個控制項。我已經習慣使用控制項來看軟體開發問題。我也不會允許程式設計師從頁面角度去寫涉及需求和應用領域資料的內容,而是要求程式設計師在其它project裡寫好應用程式控制項——至少是乙個使用者控制項,然後我拿過來「隨心所欲」地組合進簡單的頁面裡。所以樓主的問題我其實並不會遇到。

this.placeholder1.controls.add(new label());

if (!this.ispostback)

((label)this.placeholder1.controls[0]).text = "haha";

然後讓頁面上有提交按鈕,並沒有丟失這個text的值。你還是在後台那個「if(」語句設個斷點,看看label的enableviewstate、text的值有什麼異常。

我要說明一下,絕對不能放在 oninit 相關的階段去建立動態控制項。因為之所以使用動態空間,往往就是為了根據頁面上的實際viewstate(這些專門記錄狀態的機制)來選擇插入的控制項的。而init階段還沒有回填viewstate。那些在頁面設計器上控制項之所以可以自動產生在init階段建立,是因為他們本身就是傻瓜的,不是動態的。

生成 重新生成 清理

1.在解決方案資源管理器中,選擇或開啟所需的解決方案。2.在 生成 選單上,選擇 生成解決方案 重新生成解決方案 或 清理解決方案 選擇 生成 或 生成解決方案 將只編譯自上次生成以來更改過的那些專案檔案和元件。說明 如果解決方案中包括多個專案,則 生成 命令將變成 生成解決方案 選擇 重新生成解決...

重新組織 vs 重新生成索引

索引是資料庫引擎中針對表 有時候也針對檢視 建立的特別資料結構,用來幫助查詢和整理資料。索引的重要性體現在能夠使資料庫引擎快速返回查詢 結果。當對索引所在的基礎資料表進行修改時 包括插入 刪除和更新等操作 會導致索引碎片的產生。當索引的邏輯排序和基礎表或檢視的物理排序不匹配時,就會產生索引碎片。隨著...

重新生成序列號

建完序列號,並觸發序列號後,並插入了資料,但是過一段時間又清空了表的資料,再重新插入資料,這個時候再取序列號會續著上一次的序列號,如果想重新開始就要刪除序列號生成器,再重建序列號 建立序列號 create sequence aby yzfpayment method seq increment by...