IPostBackEventHandler 與 IPostBackDataHandler

本文解析了ASP.NET中IPostBackEventHandler与IPostBackDataHandler接口的区别,并通过实例介绍了如何实现这两个接口来处理页面回发事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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 事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值