一般类别的事件撰写很单纯,不过在 ASP.NET 中与前端使用者互动产生的事件就不是那么简单了;在以往的 ASP 年代是没有事件这回事的,而在 ASP.NET 把网页程序撰写真正的对象导向化,客户端使用者的操作透过 PostBack 来产生相对应的事件。例如前端使用者按钮后会引发伺服端 Button 的 Click 事件,当前端使用者输入文字框完毕后离开后会引发伺服端 TextBox 的 TextChanged 事件,在本文中就是要说明如何透过 PostBack 来产生与使用者互动的事件。

 

一、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 事件。

<ToolboxData("<{0}:MyButton runat=server></{0}:MyButton>")> _
Public Class MyButton
    Inherits WebControl
    Implements IPostBackEventHandler
 
    ''' <summary>
    ''' Click 事件。
    ''' </summary>
    Public Event Click As EventHandler
 
    ''' <summary>
    ''' 引發 Click 事件。
    ''' </summary>
    Private Sub OnClick(ByVal e As EventArgs)
        RaiseEvent Click(Me, e)
    End Sub
 
    Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
        Dim e As New EventArgs()
        OnClick(e) '引發 Click 事件
    End Sub
 
    ''' <summary>
    ''' 覆寫 Render 方法。
    ''' </summary>
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        Dim sHTML As String
 
        sHTML = String.Format("<INPUT TYPE=Submit Name={0} Value = '按鈕'/>", Me.UniqueID)
        writer.Write(sHTML)
    End Sub
 
End Class

 

在页面上拖曳 MyButton 控件,在属性窗口找到 Click 事件,点二下产生 Click 事件处理函式,并撰写测试程序代码如下。

    Protected Sub MyButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyButton1.Click
        Me.Page.Response.Write("MyButton Click 事件")
    End Sub

 

执行程序,当按下 MyButton 按钮时,就会执行它的 RaisePostBackEvent 方法,进而引发 Click 事件,也就会执行 Click 事件处理函式的程序代码。

image 
 

三、IPostBackDataHandler 界面实作

IPostBackDataHandler 接口包含 LoadPostData 及 RaisePostDataChangedEvent 方法,当页面 PostBack 时,会寻找具 IPostBackDataHandler 接口的控件,先执行LoadPostData 方法,控件在 LoadPostData 方法中会判断客户端传入值决定是否引发事件,若 LoadPostData 传回 True 表示要引发事件,此时会执行RaisePostDataChangedEvent 方法去决定要引发那些事件,反之传回 False 表示不引发事件。

我们继承 WebControl 撰写 MyText 类别来说明 IPostBackDataHandler 接口,我们简化控件程序代码直接在 Render 方法输入文字框的 HTML 原始码,并定义一个 TextChanged 事件。在 LoadPostData 方法中我们会判断客户端传入值与目前的值是否不相同,不相同时才会传回 True,此时才会执行 RaisePostDataChangedEvent 方法,进而引发  TextChanged 事件。

<ToolboxData("<{0}:MyTextbox runat=server></{0}:MyTextbox>")> _
Public Class MyTextbox
    Inherits WebControl
    Implements IPostBackDataHandler
 
    Public Property Text() As String
        Get
            Return CType(Me.ViewState("Text"), String)
        End Get
 
        Set(ByVal value As String)
            Me.ViewState("Text") = value
        End Set
    End Property
 
    ''' <summary>
    ''' TextChanged 事件。
    ''' </summary>
    Public Event TextChanged As EventHandler
 
    ''' <summary>
    ''' 引發 TextChanged 事件。
    ''' </summary>
    Private Sub OnTextChanged(ByVal e As EventArgs)
        RaiseEvent TextChanged(Me, e)
    End Sub
 
    Public Function LoadPostData(ByVal postDataKey As String, ByVal postCollection As System.Collections.Specialized.NameValueCollection) As Boolean Implements System.Web.UI.IPostBackDataHandler.LoadPostData
        '前端使用者輸入值
        Dim oNewValue As String = postCollection.Item(postDataKey)
        If oNewValue <> Me.Text Then
            Me.Text = oNewValue
            Return True
        Else
            Return False
        End If
    End Function
 
    Public Sub RaisePostDataChangedEvent() Implements System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent
        Dim e As New EventArgs()
        '引發 TextChanged 事件
        OnTextChanged(e)
    End Sub
 
    ''' <summary>
    ''' 覆寫 Render 方法。
    ''' </summary>
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        Dim sHTML As String
 
        sHTML = String.Format("<INPUT Type=text Name={0} Value={1} >", Me.UniqueID, Me.Text)
        writer.Write(sHTML)
    End Sub
 
End Class

 

在页面上拖曳 MyTextbox 及 MyButton 控件,在 MyButton 的 Click 及 MyTextbox 的 TextChanged 事件撰写如下测试程序代码。

    Protected Sub MyButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyButton1.Click
        Me.Page.Response.Write("MyButton Click 事件")
        Me.Page.Response.Write("<br/>")
    End Sub
 
    Protected Sub MyTextbox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyTextbox1.TextChanged
        Me.Page.Response.Write("MyTextbox TextChanged 事件")
        Me.Page.Response.Write("<br/>")
    End Sub

 

执行程序,第一次 MyTextbox 不输入值,直接按下 MyButton,此时只会引发 MyButton Click 事件。

image

 

第二次在 MyTextbox 输入 "A",再按下 MyButton,因为 MyTextbox 的值「空字符串->"A"」,所以会引发 MyTextbox 的 TextChanged 事件及 MyButton 的 Click 事件。

image

 

备注:本文同步发布于「第一届iT邦帮忙铁人赛」,如果你觉得这篇文章对您有帮助,记得连上去推鉴此文增加人气 ^^
http://ithelp.ithome.com.tw/question/10011861

posted on 2008-10-14 07:07  jeff377  阅读(459)  评论(0编辑  收藏  举报