每個web控件都有個ViewState值,如果一個頁面有太多的web控件而不禁用他們的viewstate值的話,會讓頁面速度大大降低。那么哪些控件的
EnableViewState="false" 哪些控件的EnableViewState="true"呢?
一個個控件說起
textbox,如果你只需要取他的text里面的值,而不是要他響應什么事件,那他的viewstate是可以禁用的.
linkbutton 和asp:button還有別的按紐,如果你只需要他響應單擊事件,那他的viewstate可以禁用.
hyperlink,一般情況下不建議用他.他的功能和<a href基本上一樣,如無特殊需要盡量不要用他.他的值如果是需要后台動態添加進去的
話,viewstate值不能禁用,否則在執行其它事件后他的值又不能顯示,如果在前台就可以直接確定他的值,那他的viewstate是可以禁用的,但無論
他的值是需要前台就可以確定還是需要后台填充進去,<a href一樣都能完成的.所以一般情況下不需要使用他
所有驗證控件,只要不需要在后台對他再進行編輯,都可以禁用viewstate,包括自定義驗證控件都可以禁用
dropdownlist,listbox還有checkboxlist這一類的都差不多,如果是前台就能確定他的選項值,那他的viewstate可以禁用,不影響他的取值,
但如果他的值是需要后台來梆定,又是需要在!ISPostBack里綁定的話,那他的viewstate值是不能禁用的,否則一執行其它事件以后,他的值就不
存在了.
其實最占用資源的就是datagrid,repeater,datalist等這些控件.
datagrid里面數據量龐大.但他的viewstate值在翻頁,編輯等操作時起到很大的作用,所以datagrid的viewstate值不能完全禁用.
我們這里以datagrid為例介紹一個如何禁用一批viewstate來優化速度
datagrid里<asp:BoundColumn>.他在瀏覽時是個Label,編輯時他是一個textbox.而label和textbox都是帶有viewstate.比如是一個5列20行的
datagrid,當他數據填充以后他就含有100個viewstate的值,這是一個龐大的數據..如果不想辦法禁用是很占用資源的.
<asp:BoundColumn>方法雖然方便,但盡量大家不要使用,用如下方法代替
<asp:TemplateColumn>
<ItemTemplate>
<div align=center>
<%# DataBinder.Eval(Container,"DataItem.id") %>
</div> //不要使用任何控件,一樣能顯示,而且不占用資源
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="Textbox2" Text='<%# DataBinder.Eval(Container,"DataItem.listid")%>' Runat="server"
EnableViewState=False Columns="自己賦值">
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>
datagrid里的項,viewstate能禁用的盡量禁用,太占資源了
===========================
第一看asp.net是在做項目之前,感覺收獲也很大,第二次看gridview是在做完項目之后對GridView的回顧,這次的感覺是:我需要多想點,知識直到用時方覺少。直入正題吧,看gridview。
一、主要的事件
(1)RowDeleting 當點擊刪除按鈕時,執行的刪除代碼。
(2)RowEding 當點擊編輯按鈕的時候執行的代碼。
(3)RowUpdating 當點擊修改按鈕的時候執行的代碼。
(4)SelectedIndexChanged || SelectedIndexChanging 事件,這兩個事件用哪個都可以,只不過執行順序有先后,當點擊選擇按鈕的時候執行的代碼,例如我們在用GridView做購物車的時候,就是用了選擇按鈕,就用到了SelectedIndexChanging事件。
(5)RowDataBound 事件,當頁面實例化完畢(控件實例化完畢),執行完Page_Load()方法的時候(數據在頁面上加載完畢),再來執行RowDataBound方法,一看Bound是過去式,就說明是在數據綁定完畢以后執行的方法。確實是,RowCreated事件是外面的Cell單元格創建好了,但是數據還未放到Cell單元格中時候所執行的方法。而RowDataBound事件是數據已經放到每一個Cell中,這時候所要執行的就是RowDataBound事件。進入RowDataBound事件中首先兩層IF判斷,判斷這一行的Type(RowType),判斷這一行數據的State,也就是狀態,一般Type主要使用DataRow,數據行。判斷State的時候要注意如果是編輯狀態下,如果只是寫了:
e.Row.RowState ==DataControlRowState.Edit
//這樣只是給普通項判斷是否出於編輯狀態,對於交替項沒有進行判斷,如何判斷:在后面在加上一句
e.Row.RowState ==(DataControlRowState.Edit | DataControlRowState.Alternate)
把上面的內容連起來:
if (e.Row.RowState== DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Edit |DataControlRowState.Alternate))
或者是這么寫:因為e.Row.RowState是一個枚舉類型的數據,枚舉類型就對應着一個具體的int類型的值:
我們可以在即使窗口中進行調試,進行判斷處於編輯狀態的普通行和交替行對應的int類型的值:分別為4、5。
所以我們又可以這么來寫:
if((int)e.Row.RowState== 4 || (int)e.Row.RowState == 5)
也可以。
二、GridView的屬性
視圖中查看到的屬性就不說了。
首先第一個:GridView.EditIndex ---->
這個屬性是得到當前編輯項的索引號,如果為修改操作,可以這么來做:
雙擊RowEditing事件進去寫代碼,首先為此屬性賦值:GridView.EditIndex == e.NewEditIndex;//GridView的編輯項的索引號為當前項的索引號。記住:e.NewEditIndex也是GridView一個重要的屬性,當前操作的這一行的索引號。
GridView一定要注意的:
三、ViewState——也是一個重點。
當.NET頁面在運行的時候,存 儲兩份數據,一份在頁面中顯示出來了,一份存儲ViewState中,首先一個認識:HTTP協議是一種無狀態的協議,再來理解什么是無狀態的協議,比如 說我這次訪問了新浪,新浪頁面一加載完畢就與我斷開連接,因為新浪服務器已經給了我頁面,於是新浪的服務器就與我的電腦斷開連接了,我在看什么,我在干什 么都不知道,那么存儲狀態用什么呢?首先第一點:Session、再一點:Cookie、再一點:Application、再一點:在我們.NET中微軟為我們提供了ViewState。
Session是存儲在服務器端,用SessionID來區分不同的用戶對象,Cookie是存儲在用戶的硬盤中的某一個文件夾下,之前也和大伙看了一下在瀏覽器中臨時文件夾下的Cookie,怎么查找。
主要說ViewState,其實不止是GridView有ViewState,Repeater、DataList、TextBox等等表單控件和數據顯示控件都有ViewState,它所帶來的效果是什么,當我們在用TextBox來做一個注冊頁面的時候,如果是用普通的Form表單進行數據提交,如果賬戶已存在,會直接跳轉到注冊頁面,表單中的數據全部沒有了,而用.NET中的TextBox控件如果填寫的用戶名已存在,它不會把數據全部清除,而是保留着。這就是ViewState的作用。
在GridView中,如果不存在ViewState,把ViewState禁用掉,會出現什么情況:當第一次訪問頁面的時候數據正常加載,如果GridView中存在按鈕,按鈕 默認都提交,一旦提交,重新加載頁面,數據全部沒有,實例化出頁面以后,頁面對象有了,GridView對象實例化出來了,控件有了,但是在 Page_Load()方法中一旦判斷是PostBack按鈕提交過來的就不會再執行Page_Load()中的代碼,Page_Load()是為實例化 好的控件填充數據的,一旦不走Page_Load()中的代碼,數據也就不會填充到GridView控件中,我們看到的效果就是,一點擊按鈕 GridView沒有了。這就是禁用ViewState的結果。可以解決,按鈕代碼執行完畢后在調用一下綁定數據的方法。
HTTP協議是一種無狀態的協 議,我訪問了一個aspx頁面,服務器不會記住這個頁面對象,一旦在服務器中聲稱好了我請求的這個aspx頁面對象,便會立即釋放,再次訪問這個頁面的時 候,服務器不會記得第一次訪問時候的那個頁面對象,而是再次生成一個頁面對象,每次都是這樣。ViewState的作用就是存放一份數據,讓服務器記住我 這個頁面已經實例化過一次了,直接通過ViewState從服務器端取得上次實例化好的頁面對象。
這是.NET中所特有的,什么時候不必要用ViewState,也就是把ViewState禁用了呢?當頁面上沒有按鈕的時候,可以禁用掉。所以我們在使用GridView的時候一般用超鏈接 <A>標簽,而避免使用按鈕,因為有按鈕就必須有ViewState,頁面加載的速度肯定會慢下來。再就是有ViewState的頁面一定要分頁。
后台為按鈕添加JavaScript事件:
在RowDataBound事件中寫代碼,查找按鈕,轉換成對應的Button類型,然后為按鈕的屬性:OnclientClick賦對應的JavaScript代碼即可。
例如:
(e.Row.Cells[5].Controls[2]as LinkButton).OnClientClick = "return window.confirm('確認要刪除嗎?')";
在RowUpdating事件中如何取得每一個Cell中的值:
string name =(GridView1.Rows[e.RowIndex].Cells[1].Controls[0] as TextBox).Text;
GridView1.Rows[e.RowIndex].Cells[1].Controls[0]
或
GridView1.Rows[e.RowIndex].Cells[1].FindControl("")
和DataList一定要區分好,DataList中是:
e.Item.FindControl("")as ....