※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


2011-08-07 19:57:00 (Sun)



Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Collections.Specialized

''' <summary>
''' GridViewに含めるラジオボタン・コントロール。
''' </summary>
''' <remarks></remarks>
<DefaultProperty("Text"), ToolboxData("<{0
:GridViewRadioButton runat=server></{0}:GridViewRadioButton>")> _
Public Class GridViewRadioButton
   Inherits RadioButton

   ''' <summary>
   ''' リクエスト送信されたデータを処理します。
   ''' このコントロールによって出力されたラジオボタンは、name属性にGroupName、
   ''' value属性にUniqueID を出力します。
   ''' name属性が GroupName で送信された値を確認して、このコントロールのインスタンスが
   ''' 選択されたラジオボタンであるか判断します。
   ''' </summary>
   ''' <param name="postDataKey">未使用</param>
   ''' <param name="postCollection">リクエスト送信されたデータのコレクション。</param>
   ''' <returns>
   ''' このインスタンスの選択状態が、「非選択」から「選択」になったときにTrue。
   ''' その他はFalse。
   ''' </returns>
   ''' <remarks></remarks>
   Protected Overrides Function LoadPostData( _
           ByVal postDataKey As String _
           , ByVal postCollection As NameValueCollection) As Boolean

       ' 選択されたラジオボタンの値
       Dim checkedValue = postCollection(Me.GroupName)

       ' このインスタンスのラジオボタンが選択されたのか判定
       Dim meIsChecked As Boolean = (checkedValue = Me.UniqueID)

       ' 選択状態に変化があった場合、このインスタンスの選択状態を併せて変更する
       If Me.Checked <> meIsChecked Then
           Me.Checked = meIsChecked

           ' 非選択から選択になったときのみ Trueを戻す。
           Return meIsChecked
       End If

       ' 選択状態に変化がない場合は、False
       Return False

   End Function


   ''' <summary>
   ''' このコントロールを画面表示用に出力します。
   ''' </summary>
   ''' <param name="writer">標準で使用するHtmlTextWriter</param>
   ''' <remarks></remarks>
   Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)

       ' HtmlTextWriterを、このクラス専用に置き換えて、画面出力します。
       MyBase.Render(New RadioWriter(writer, Me))

   End Sub

   ''' <summary>
   ''' このクラスのラジオボタンを出力するHtmlTextWriter。
   ''' Decoratorパターンで、一部加工した値を、本来のHtmlTextWriterに出力します。
   ''' </summary>
   ''' <remarks></remarks>
   Private Class RadioWriter
       Inherits HtmlTextWriter

       ''' <summary> 出力対象のラジオボタン。</summary>
       Private _radio As GridViewRadioButton

       ''' <summary>
       ''' コンストラクタ。
       ''' 
       ''' </summary>
       ''' <param name="writer">標準で使用するHtmlTextWriter</param>
       ''' <param name="radio">出力対象のラジオボタン。</param>
       ''' <remarks></remarks>
       Public Sub New( _
               ByVal writer As HtmlTextWriter _
               , ByVal radio As GridViewRadioButton)

           ' スーパークラスのコンストラクタの呼び出し
           MyBase.New(writer)

           ' ラジオボタン
           Me._radio = radio

       End Sub

       ''' <summary>
       ''' HTML出力時のタグの属性を設定します。
       ''' </summary>
       ''' <param name="key">属性の種別</param>
       ''' <param name="value">標準で出力する属性値</param>
       ''' <remarks></remarks>
       Public Overrides Sub AddAttribute( _
               ByVal key As HtmlTextWriterAttribute _
               , ByVal value As String)

           Select Case key
               Case HtmlTextWriterAttribute.Name
                   ' NAME属性
                   ' GroupNameを出力して、ラジオボタン同士のNAME属性を揃える
                   MyBase.AddAttribute(key, Me._radio.GroupName)
               Case HtmlTextWriterAttribute.Value
                   ' VALUE属性
                   ' ラジオボタンを識別するUniqueIDを出力する
                   MyBase.AddAttribute(key, Me._radio.UniqueID)
               Case Else
                   ' その他の属性は、スーパークラスに委譲する
                   MyBase.AddAttribute(key, value)
           End Select

       End Sub
   End Class

End Class
}