IPostBackEventHandlerとIPostBackDataHandler


一、IPostBackEventHandlerとIPostBackDataHandlerインターフェース制御項目PostBackで発生したイベントを処理するには、IPostBackEventHandlerまたはIPostBackDataHandlerインターフェースを実作しなければならない.この2つのインターフェースにはどのような違いがあるのだろうか.例えばButtonは実作IPostBackEventHandlerインターフェースであり、ButtonのClickイベントのような制御項目によって生成されたPostBackが直接イベントを開始する.例えばTextBoxは実作IPostBackDataHandlerインターフェースであり、ページにPostBackが生成されると、ユーザー側から入力された新しい値が制御項目に伝達され、制御項目自体がイベントを引き起こすかどうかを決定する.TextBoxの例では、新しい値が古い値と異なる場合にTextChangedイベントが発生すると判断します.二、IPostBackEventHandlerインターフェース実作まずIPostBackEventHandlerインターフェースを紹介し、RaisePostBackEventメソッドを含み、制御項目はこのメソッドでそれらのイベントを開始する必要がある.WebControlがMyButtonカテゴリを作成してIPostBackEventHandlerインタフェースを説明するためにWebControlを継承し、Renderメソッドでボタンを直接入力するHTMLオリジナルコードを制御するプログラムを簡略化し、Clickイベントを定義します.IPostBackEventHandlerインターフェースを実作するRaisePostBackEventメソッドで、このメソッドではClickイベントが直接発生します.
オリジナルファイルをクリップブックにコピーして印刷するには
Public Class MyButton  
    Inherits WebControl  
    Implements IPostBackEventHandler  
  
    '''   
'''Clickイベント.  
    ''' 
  
    Public Event Click As EventHandler  
  
    '''   
'''Clickイベントを開始します.  
    ''' 
  
    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  
  
    '''   
'''Renderメソッドを上書きします.  
    ''' 
  
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)  
        Dim sHTML As String  
  
        sHTML = String.Format(",Me.UniqueID)        writer.Write(sHTML)  
    End Sub  
  
End Class  
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イベントを見つけ、ポイント2で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  
    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イベント処理関数のプログラムコードも実行されます.
三、IPostBackDataHandlerインターフェース実作
IPostBackDataHandlerインタフェースにはLoadPostDataおよびRaisePostDataChangedEventメソッドが含まれており、ページPostBackの場合、IPostBackDataHandlerインタフェースを持つ制御項目を探し、まずLoadPostDataメソッドを実行し、制御項目はLoadPostDataメソッドでユーザー側の入力値でイベントを開始するかどうかを決定し、LoadPostDataがTrueに戻ってイベントを開始することを示すと、RaisePostDataChangedEventメソッドを実行して、それらのイベントを開始するかどうかを決定し、逆にFalseに戻るとイベントを開始しないことを示します.
WebControlのMyTextカテゴリの作成を継承してIPostBackDataHandlerインタフェースを説明し、制御項目プログラムコードを簡略化してRenderメソッドに直接文字ボックスのHTMLオリジナルコードを入力し、TextChangedイベントを定義します.LoadPostDataメソッドでは、ユーザー側の入力値が現在の値と異なるかどうかを判断し、異なる場合にTrueに戻ります.この場合、RaisePostData ChangedEventメソッドが実行され、TextChangedイベントが発生します.
オリジナルファイルをクリップブックにコピーして印刷するには
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  
  
    '''   
'''TextChangedイベント.  
    ''' 
  
    Public Event TextChanged As EventHandler  
  
    '''   
'''TextChangedイベントを開始します.  
    ''' 
  
    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  
  
    '''   
'''Renderメソッドを上書きします.  
    ''' 
  
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)  
        Dim sHTML As String  
  
        sHTML = String.Format("", Me.UniqueID, Me.Text)  
        writer.Write(sHTML)  
    End Sub  
  
End Class  
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("
")  
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("
")  
End Sub  
    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で「A」を入力し、MyButtonを押すと、MyTextboxの値「空文字列->「A」のため、MyTextboxのTextChangedイベントおよびMyButtonのClickイベントが発生します.