Web Form 的事件簡介

摘要:Web Form 的事件簡介

學習ASP.NET程式設計時,對於Web Form的事件要有明確的瞭解,這是踏出ASP..NET學習之路的起始點。因為若對於Web Form事件一知半解,可能會導致撰寫程式碼時無法理解的異常錯誤,若你是由Windows程式開發轉而學習ASP.NET網頁開發,更需要明確瞭解這部分,因為它跟以往Windows程式的表單事件差異很大。

以下以一個簡單的範例來說明Web Form事件,從這個範例中你將會更明確的瞭解Web Form事件的順序及觸發時機。首先開啟一個新的Web專案,在頁面放直一個TextBox(Text屬性預設為A)Button控制項,在PageTextBox控制項的每個事件中,將其事件名稱顯示至網頁,然後在按下Button後去改變TextBox的值,其中aspxaspx.vb的程式碼如下所示。

 

*.aspx程式碼

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>未命名頁面</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server">A</asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" /><br />
    </div>
    </form>
</body>
</html>

  

*.aspx.vb程式碼

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        Me.Response.Write("<B>Page PreInit</B><BR/>")
    End Sub


    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        Me.Response.Write("<B>Page Init</B><BR/>")
    End Sub


    Protected Sub Page_InitComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.InitComplete
        Me.Response.Write("<B>Page InitComplete</B><BR/>")
    End Sub


    Protected Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreLoad
        Me.Response.Write("<B>Page PreLoad</B><BR/>")
    End Sub


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Response.Write("<B>Page Load</B><BR/>")
    End Sub


    Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete
        Me.Response.Write("<B>Page LoadComplete</B><BR/>")
    End Sub


    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        Me.Response.Write("<B>Page PreRender</B><BR/>")
    End Sub


    Protected Sub Page_PreRenderComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRenderComplete
        Me.Response.Write("<B>Page PreRenderComplete</B><BR/>")
    End Sub


    Protected Sub Page_SaveStateComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SaveStateComplete
        Me.Response.Write("<B>Page SaveStateComplete<</B>BR/>")
    End Sub


    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Response.Write("Button Click<BR/>")
        TextBox1.Text = "B"
    End Sub


    Protected Sub TextBox1_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Init
        Me.Response.Write("TextBox Init - Text: " & TextBox1.Text & "<BR/>")
    End Sub


    Protected Sub TextBox1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Load
        Me.Response.Write("TextBox Load - Text: " & TextBox1.Text & "<BR/>")
    End Sub


    Protected Sub TextBox1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.PreRender
        Me.Response.Write("TextBox PreRender - Text: " & TextBox1.Text & "<BR/>")
    End Sub


    Protected Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Me.Response.Write("TextBox TextChanged - Text: " & TextBox1.Text & "<BR/>")
    End Sub

End Class



 

 

1 執行初始畫面

 

執行程式後初始畫面輸出如下 1所示,由顯示結果可以清楚的瞭解到Web Form的事件觸發順序,其中粗體字的部分是Page的事件,細體字的部分是TextBox控制項的事件及其Text屬性值。對於Page的每個事件,當每一次的PostBack動作,這些事件都會依這個順序重覆觸發一次,跟以往開發Window Form時,Load事件只會觸發一次的情形差異很大。

一般最常使用是InitLoad這二個事件,而ASP.NET的初學者也常對於什麼狀況應該寫在InitLoad事件搞不清楚。簡單的區分,如果是要動態建立控制項,那就要在Init事件中;如果是要讀取正確的控制項屬性值,那就要在Load事件中。需要這樣做的原因是LoadViewState的動作介於Init事件之後及Load事件之前。

LoadViewState的作用是載入ViewState的資料來更新控制項屬性值,所以你必須在LoadViewState之前就把控制項建立完成,才有辨法由ViewState中載入最新屬性值,所以一定要在Init事件中把控制項建立完成,在此事件中讀取控制項的屬性值都是初始值,也就是設計階段時屬性視窗中的值。而Load事件是在LoadViewState動作之後觸發,所以在Load事件中讀到的控制項屬性值才是最新值,而不會是初始值。

 


2 第一次按下Button後的結果

 

當第一次按下按鈕後的結果如 2所示,首先請先注意一下Button Click事件的觸發順序,它是在Page Load事件之後才發生;因為在Load事件時,所有控制項都已經建立完成,ASP.NET的機制才能由前端傳回值(Page.Request.Form)來決定是否觸發該控制項事件。記得我們在Button Click事件中去改變TextBoxText屬性值為B嗎?若在Load事件中去讀取TextBoxText屬性值還是初始值A,因為此時Button Click事件還未觸發;要在Button Click事件之後,TextBoxText屬性值才會變更為B

 

 

3 第二次按下Button後的結果

 

 

當第二次按下Button後的結果如 3所示,請注意TextBox Init 事件中Text屬性值ATextBox Load事件中Text屬性值B,有沒有發覺與 2不一樣的地方就是在Load時,Text屬性值已經變B了,因為第一次按下Button時,TextBox控制項的Text屬性值已經改變並儲存於ViewState中,而 3Load事件中的Text屬性值就是由ViewState中載入的結果。

 

 


 

ASP.NET 魔法學院