DOBON.NET DOBON.NETプログラミング掲示板過去ログ

GridView内にラジオボタンを配置する方法

環境/言語:[VS2005]
分類:[ASP.NET]

いつもお世話になっております。
VB.NETでWebフォームを作成しております。
GridVIew内でラジオボタンを配置しようと考えていたのですが、
グループネームが統一されず困っております。
検索したところ、CodeZineで紹介されておりました

http://codezine.jp/a/article/aid/840.aspx

をVBに変換して使おうと考えております。
そこで質問なのですが、画面レイアウト時のツールボックスに表示する方法を教えてください。
よろしくお願いします。
2008/04/22(Tue) 18:39:05 編集(投稿者)

はじめまして、H.K.R.と申します。
 
 私はASP.NETについてはほとんど無知なので、
 もし変なことを書いていたら申し訳ないのですが、
 ご紹介いただいたサイトを参考にして、以下のコードでとりあえず、
  
   GridView内の複数行にまたがって配置された複数個のRadioButtonのうちのどれか1つしか
   チェック状態にすることができないようにする
 
 ことができましたので、
 試してみてはいかがでしょうか?
 
[追記]当該サイトに全ソースコードが掲載されていることに気づきませんでした・・・(汗 [/追記]
 
 ※ 私が試した環境:WindowsXPHomeSP2、InternetExplorer7、ASP.NET開発サーバー、
           VisualWebDeveloper2008ExpressEdition(対象Frameworkは、.NET Framework 2.0)
           VisualBasic2008ExpressEdition(対象Frameworkは、.NET Framework 2.0)
 
> 画面レイアウト時のツールボックスに表示する方法を教えてください。
  
 VisualBasic2008ExpressEdition(対象Frameworkは.NET Framework 2.0)と、
 VisualWebDeveloper2008ExpressEdition(対象Frameworkは.NET Framework 2.0)の場合は、
 以下の手順で行うことができました。
 1. VB2008ExpressEditionでクラスライブラリプロジェクトを作成し、
   対象Frameworkを.NET Framework 2.0に変更。
   カスタムコントロールのソースコードを入力し、
   ソリューションエクスプローラのプロジェクト名を右クリック→「ビルド」を選択して、ビルドを行う。
 2. VisualWebDeveloper2008ExpressEditionを起動し、
   ツールボックスを右クリック→「アイテムの選択」、「.NET Framework コンポーネント」タブを選択して
   「参照」ボタンをクリック→手順1.でビルドした.dllファイルを選択→「OK」ボタンをクリック。
 3. デザイナ上でツールボックスから当該カスタムコントロールをDragAndDropすると、
   現在開いているWebサイトのBinフォルダに、1.で作成した.dllファイル等の参照が追加される。
 
 ※ VisualStudioの上位Editionの場合は、手元の文献(*)によると、手順がもっと簡単で、
  「ファイル」メニューの「プロジェクトの追加」をクリック、
  「テンプレート」ボックスから「Webカスタムコントロール」を選択し、
  カスタムコントロールのソースコードを入力してビルドした後、
  上記2.の手順でツールボックスに追加すればよいようです。
 
 (*)日経BPソフトプレス発行「プログラミングVisualBasic.NET Vol.2活用編」、pp. 818 - 820.
 
 
(以下コード)
' VisualWebDeveloper2008ExpressEdition(対象Frameworkは.NET Framework 2.0)のコード
' 
Imports System.Data
 
Partial Class _Default
    Inherits System.Web.UI.Page
 
    ' GridView2がデザイナで配置されており、
    ' その第1列目がTemplate列であり、
    ' かつそのTemplate列の中にGridViewRadioButtonItemが配置されており、
    ' かつそのGridViewRadioButtonItemのGroupNameプロパティに何らかの値(文字列)が設定されていることを前提とする
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        testF()
        MyBase.OnLoad(e)
    End Sub
     
    Private Sub testF()
        If Me.IsPostBack = False Then
 
            Me.GridView2.DataSource = Me.CreateDataSource2()
            Me.GridView2.DataBind()
 
        Else
            For i As Integer = 0 To Me.GridView2.Rows.Count - 1
                Dim tr As TableRow = Me.GridView2.Rows(i)
                Dim tc As TableCell = tr.Cells(0)
                For Each c As Control In tc.Controls
                    If TypeOf c Is RadioButton Then
                        Dim rb As RadioButton = DirectCast(c, RadioButton)
                        If rb.Checked = True Then
                            ' ↓ブラウザの背後にMsgBoxが表示される場合があります。
                            ' ↓(その場合、ブラウザの動作が「固まった」ように見えます。念のため)
                            MsgBox(tr.Cells(1).Text + " をチェックしました。")
                        End If
                    End If
                Next
            Next
        End If
    End Sub
 
    Private Function CreateDataSource2() As ICollection
        Dim dt As New DataTable
        dt.Columns.Add(New DataColumn("Field1", GetType(String)))
        dt.Columns.Add(New DataColumn("Field2", GetType(String)))
        dt.Columns.Add(New DataColumn("Field3", GetType(String)))
        dt.Columns.Add(New DataColumn("Field4", GetType(String)))

        For i As Integer = 1 To 7
            Dim dr As DataRow = dt.NewRow
            For j As Integer = 1 To dt.Columns.Count
                dr.Item(j - 1) = String.Format("{0}行目のデータ{1}", i, j)
            Next
            dt.Rows.Add(dr)
        Next
        Dim dv As New DataView(dt)
        Return dv
    End Function
End Class
 
' VisualBasic2008ExpressEdition(対象Frameworkは.NET Framework 2.0)のコード
' (参考文献:http://codezine.jp/a/article/aid/840.aspx?p=1)
'
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing.Design
Imports Microsoft.VisualBasic
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.IO
 
Public Class GridViewRadioButtonItem
    Inherits RadioButton
 
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        ' このプロシージャ内のコードにはあまり自信なし(これでとりあえず意図通りに動作していますが・・・)
        Dim tw As New HtmlTextWriterEx(writer, Me)
        MyBase.Render(tw)
    End Sub
 
    Protected Overrides Function LoadPostData(ByVal postDataKey As String, ByVal postCollection As System.Collections.Specialized.NameValueCollection) As Boolean
        Dim b As Boolean = (postCollection(Me.GroupName) = Me.UniqueID)
        If Me.Checked <> b Then
            Me.Checked = b
            Return b
        Else
            Return False
        End If
    End Function
 
    Private Class HtmlTextWriterEx
        Inherits HtmlTextWriter
 
        Public Sub New(ByVal tw As TextWriter, ByVal parent As RadioButton)
            MyBase.New(tw)
            Me.m_parent = parent
        End Sub
 
        Private m_parent As RadioButton
 
        Public Overrides Sub AddAttribute(ByVal key As System.Web.UI.HtmlTextWriterAttribute, ByVal value As String)
            Select Case key
                Case HtmlTextWriterAttribute.Name
                    MyBase.AddAttribute(key, m_parent.GroupName)
                Case HtmlTextWriterAttribute.Value
                    MyBase.AddAttribute(key, m_parent.UniqueID)
                Case Else
                    MyBase.AddAttribute(key, value)
            End Select
        End Sub
    End Class
 
End Class
 
以上です。

DOBON.NET | プログラミング道 | プログラミング掲示板