IPostBackEventHandler 與 IPostBackDataHandler

来源:互联网 发布:软件license管理 编辑:程序博客网 时间:2024/06/05 06:14

一、IPostBackEventHandler 與 IPostBackDataHandler 介面
控制項要處理 PostBack 產生的事件,必須實作 IPostBackEventHandler 或 IPostBackDataHandler介面,這二個介面有什麼差別呢?例如 Button 是實作IPostBackEventHandler 介面,由控制項產生的 PostBack直接引發事件,如 Button 的 Click 事件。例如 TextBox 是實作 IPostBackDataHandler 介面,當頁面產生PostBack 時,會傳用戶端輸入的新值給控制項,由控制項本身去決定是否引發該事件;以 TextBox舉例來說,它會判斷新值與舊值不同時才會引發 TextChanged 事件。

二、IPostBackEventHandler 介面實作
首先介紹 IPostBackEventHandler 介面,它包含 RaisePostBackEvent方法,控制項在此方法中需處理要引發那些事件。我們繼承 WebControl 撰寫 MyButton 類別來說明IPostBackEventHandler 介面,我們簡化控制項程式碼直接在 Render 方法輸入按鈕的 HTML 原始碼,並定義一個Click 事件。實作 IPostBackEventHandler 介面的 RaisePostBackEvent 方法,在此方法中直接引發Click 事件。

檢視原始檔複製到剪貼簿列印關於
  1. Public Class MyButton  
  2.     Inherits WebControl  
  3.     Implements IPostBackEventHandler  
  4.   
  5.     ''' <summary>  
  6.     ''' Click 事件。  
  7.     ''' </summary>  
  8.     Public Event Click As EventHandler  
  9.   
  10.     ''' <summary>  
  11.     ''' 引發 Click 事件。  
  12.     ''' </summary>  
  13.     Private Sub OnClick(ByVal e As EventArgs)  
  14.         RaiseEvent Click(Me, e)  
  15.     End Sub  
  16.   
  17.     Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent  
  18.         Dim e As New EventArgs()  
  19.         OnClick(e) '引發 Click 事件  
  20.     End Sub  
  21.   
  22.     ''' <summary>  
  23.     ''' 覆寫 Render 方法。  
  24.     ''' </summary>  
  25.     Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)  
  26.         Dim sHTML As String  
  27.   
  28.         sHTML = String.Format("<INPUT TYPE=Submit Name={0} Value = '按鈕'/>", Me.UniqueID)  
  29.         writer.Write(sHTML)  
  30.     End Sub  
  31.   
  32. End Class  

在頁面上拖曳 MyButton 控制項,在屬性視窗找到 Click 事件,點二下產生 Click 事件處理函式,並撰寫測試程式碼如下。
檢視原始檔複製到剪貼簿列印關於
  1. Protected Sub MyButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyButton1.Click  
  2.     Me.Page.Response.Write("MyButton Click 事件")  
  3. End Sub  

執行程式,當按下 MyButton 按鈕時,就會執行它的 RaisePostBackEvent 方法,進而引發 Click 事件,也就會執行 Click 事件處理函式的程式碼。


三、IPostBackDataHandler 介面實作
IPostBackDataHandler 介面包含 LoadPostData 及 RaisePostDataChangedEvent方法,當頁面 PostBack 時,會尋找具 IPostBackDataHandler 介面的控制項,先執行LoadPostData方法,控制項在 LoadPostData 方法中會判斷用戶端傳入值決定是否引發事件,若 LoadPostData 傳回 True表示要引發事件,此時會執行RaisePostDataChangedEvent 方法去決定要引發那些事件,反之傳回 False 表示不引發事件。

我們繼承 WebControl 撰寫 MyText 類別來說明 IPostBackDataHandler 介面,我們簡化控制項程式碼直接在Render 方法輸入文字框的 HTML 原始碼,並定義一個 TextChanged 事件。在 LoadPostData方法中我們會判斷用戶端傳入值與目前的值是否不相同,不相同時才會傳回 True,此時才會執行 RaisePostDataChangedEvent方法,進而引發 TextChanged 事件。
檢視原始檔複製到剪貼簿列印關於
  1. Public Class MyTextbox  
  2.     Inherits WebControl  
  3.     Implements IPostBackDataHandler  
  4.   
  5.     Public Property Text() As String  
  6.         Get  
  7.             Return CType(Me.ViewState("Text"), String)  
  8.         End Get  
  9.         Set(ByVal value As String)  
  10.             Me.ViewState("Text") = value  
  11.         End Set  
  12.     End Property  
  13.   
  14.     ''' <summary>  
  15.     ''' TextChanged 事件。  
  16.     ''' </summary>  
  17.     Public Event TextChanged As EventHandler  
  18.   
  19.     ''' <summary>  
  20.     ''' 引發 TextChanged 事件。  
  21.     ''' </summary>  
  22.     Private Sub OnTextChanged(ByVal e As EventArgs)  
  23.         RaiseEvent TextChanged(Me, e)  
  24.     End Sub  
  25.   
  26.     Public Function LoadPostData(ByVal postDataKey As String, ByVal postCollection As System.Collections.Specialized.NameValueCollection) As Boolean Implements System.Web.UI.IPostBackDataHandler.LoadPostData  
  27.         '前端使用者輸入值  
  28.         Dim oNewValue As String = postCollection.Item(postDataKey)  
  29.         If oNewValue <> Me.Text Then  
  30.             Me.Text = oNewValue  
  31.             Return True  
  32.         Else  
  33.             Return False  
  34.         End If  
  35.     End Function  
  36.   
  37.     Public Sub RaisePostDataChangedEvent() Implements System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent  
  38.         Dim e As New EventArgs()  
  39.         '引發 TextChanged 事件  
  40.         OnTextChanged(e)  
  41.     End Sub  
  42.   
  43.     ''' <summary>  
  44.     ''' 覆寫 Render 方法。  
  45.     ''' </summary>  
  46.     Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)  
  47.         Dim sHTML As String  
  48.   
  49.         sHTML = String.Format("<INPUT Type=text Name={0} Value={1} >", Me.UniqueID, Me.Text)  
  50.         writer.Write(sHTML)  
  51.     End Sub  
  52.   
  53. End Class  

在頁面上拖曳 MyTextbox 及 MyButton 控制項,在 MyButton 的 Click 及 MyTextbox 的 TextChanged 事件撰寫如下測試程式碼。
檢視原始檔複製到剪貼簿列印關於
  1. Protected Sub MyButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyButton1.Click  
  2.     Me.Page.Response.Write("MyButton Click 事件")  
  3.     Me.Page.Response.Write("<br/>")  
  4. End Sub  
  5.   
  6. Protected Sub MyTextbox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyTextbox1.TextChanged  
  7.     Me.Page.Response.Write("MyTextbox TextChanged 事件")  
  8.     Me.Page.Response.Write("<br/>")  
  9. End Sub  

執行程式,在 MyTextbox 輸入 "A",再按下 MyButton,因為 MyTextbox 的值「空字串->"A"」,所以會引發 MyTextbox 的 TextChanged 事件及 MyButton 的 Click 事件。
原创粉丝点击