C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: テーブルのtdタグの中にRadioButton


(過去ログ 11 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■1916 / inTopicNo.1)  テーブルのtdタグの中にRadioButtonを埋め込む
  
□投稿者/ かのかの (1回)-(2007/03/08(Thu) 18:43:50)

分類:[VB.NET (ASP.NET)] 

こんにちは。かのかのと申します。

ASP+.Net VBでプログラムを組んでいるのですが、リピートタグで
かつTD(セル)の中にラジオボタンを埋め込むたいと思っています。

<表示としてはこんなかんじです>
※・はラジオボタンにしたいです。(1個しか選択できない) 
 ■はボタンです。選択ボタンをクリックしたときに選択されている
  ラジオボタンの値を取得してテーブルに内容を確認しに行きたいです。
=======================
|選択|  名前  |  所属  | 性別 |
=======================
| ・ |かのかの  |   大学生   |  女  |
=======================
| ・ |たろう   |   中学生   |  男  |
=======================
| ・ |次郎    |   高校生   |  男  |
=======================
      ■選択    ■戻る

列数はデータベースから引っ張ってくるのでテーブル全体をリピートで囲い、
trタグの中身をItemTemplateでくくっていけばよいのでは!
と思ったのですが、ラジオボタンが正常に表示されません。

☆ASP側
<asp:repeater id="rptList" runat="server">
 <HeaderTemplate>
  <table border="1" width="600" cellpadding="1" cellspacing="0">
   <tr>
    <td align =center  width="50">選択</td>
    <td align =center  width="150">名前</td>
    <td align =center  width="100">所属</td>
    <td align =center  width="100">性別</td>
   </tr>
 </HeaderTemplate>
 <ItemTemplate>
  <tr>
   <td class="STANDARD_C">
    <asp:RadioButtonList id="optList" runat="server" >
     <asp:ListItem Value ='<%# DataBinder.Eval(Container.DataItem, "strUserID") %>'></asp:ListItem>
    </asp:RadioButtonList>
   </td>
   <td class="STANDARD_L">
    <%# DataBinder.Eval(Container.DataItem, "strName") %>
   </td>
   <td>
    <%# DataBinder.Eval(Container.DataItem, "strBelong") %>
   </td>
   <td>
    <%# DataBinder.Eval(Container.DataItem, "strSex") %>
   </td>
  </tr>
 </ItemTemplate>
 <FooterTemplate>
  </table>
 </FooterTemplate>
</asp:repeater >

☆VB側のロードイベントに記述したソース
Dim values As New ArrayList

values.Add(New PositionData("00001", "かのかの", "大学生", "女"))
values.Add(New PositionData("00002", "たろう", "中学生", "男"))
values.Add(New PositionData("00003", "次郎", "高校生", "男"))

rptList.DataSource = values
rptList.DataBind()

☆PositionDataのなかみ
Public Class PositionData

  Private s_strUserID As String
  Private s_strName As String
  Private s_strBelong As String
  Private s_strSex As String

  Public Sub New(ByVal newStrUserID As String, ByVal newStrName As String, _
                ByVal newStrBelong As String, ByVal newStrSex As String)

      Me.s_strUserID = newStrUserID
      Me.s_strName = newStrName
      Me.s_strBelong = newStrBelong
      Me.s_strSex = newstrSex
  End Sub


  Public ReadOnly Property strUserID() As String
    Get
    Return s_strUserID
  End Get
  End Property

  Public ReadOnly Property strName() As String
    Get
    Return s_strName
  End Get
  End Property

  Public ReadOnly Property strBelong() As String
    Get
    Return s_strBelong
  End Get
  End Property

  Public ReadOnly Property strSex() As String
    Get
    Return s_strSex
  End Get
  End Property
End Class

として実行したところ
BC30676: 'DataBinding' は 'System.Web.UI.WebControls.ListItem' のイベントではありません。
というエラーが帰ってきました。

どうやったら正常にできるかいろいろ調べたのですが、探し方が悪いのか
発見できませんでした。
ご存知の方がいらっしゃいましたらよろしくお願いします。

引用返信 編集キー/
■1925 / inTopicNo.2)  Re[1]: テーブルのtdタグの中にRadioButton
□投稿者/ Hirotow (64回)-(2007/03/08(Thu) 20:06:43)
Hirotow さんの Web サイト
2007/03/08(Thu) 20:07:11 編集(投稿者)

そういった用途であればDataGridコントロールを使ってみてはどうでしょうか?
2005であればですが。
引用返信 編集キー/
■1927 / inTopicNo.3)  Re[2]: テーブルのtdタグの中にRadioButton
□投稿者/ ぼのぼの (21回)-(2007/03/08(Thu) 20:45:33)
2007/03/08(Thu) 21:01:36 編集(投稿者)
No1925 (Hirotow さん) に返信
> 2007/03/08(Thu) 20:07:11 編集(投稿者)
>
> そういった用途であればDataGridコントロールを使ってみてはどうでしょうか?
> 2005であればですが。
2005ならGridViewですよね。
選択にラジオボタンを使える機能なんて標準でついてましたっけ?

No1916 (かのかの さん) に返信
なぜRadioButtonListを使っているのでしょう?RadioButtonで十分では?
とはいえ、RadioButtonを使うと行ごとに<input type="radio">のname属性が変わってしまうので、
一つだけ選択できるラジオボタンにはならないですね。

で、一応思いついた代替案ですが。
(1)選択列のItemTemplateにLiteralコントロールを置く
(2)りぴーたーのItemDataBoundイベントでLiteralに直接ラジオボタンのHTMLを書いちゃう。
 このとき、nameに適当な一意の名前を、valueをArrayListのインデックスにしておく。
(3)これにより描画されたラジオボタンはサーバコントロールでないので、チェック状態の復元は
 自前でやらなければならない。Page_LoadでRequest("名前")で値を取得し、ViewStateに保持する。
 そして、(2)でViewStateと同じインデックスのとこだけcheckedをつけるようにする。

あと、VS2003だと使えない部品とかあるので、
質問の際はVisualStudioか.NET Frameworkのバージョンを書いてくれないと回答しづらいっす。
引用返信 編集キー/
■1929 / inTopicNo.4)  Re[3]: テーブルのtdタグの中にRadioButton
□投稿者/ かのかの (2回)-(2007/03/08(Thu) 20:53:17)
ぼのぼのさん>
 大変失礼しました。
 FrameWorkは1.1
 VB2003(Ver7.1.3091)です。

Hirotowさん>
 DataGridを使ってみましたが、残念なことに2003だったので
 ButtonTypeがPushButtonかLinkButtonしか選択できませんでした。
 見た目的に1件しか選択できない、
 (かつイベントは選択ボタンか戻るボタン押下時のみで処理したいので)
 という監事で作りたいので私のイメージとは違いました。
 でもちがう画面を作るときには参考になりそうです。ありがとうございます。
引用返信 編集キー/
■1930 / inTopicNo.5)  Re[4]: テーブルのtdタグの中にRadioButton
□投稿者/ ぼのぼの (22回)-(2007/03/08(Thu) 21:04:05)
うあ、まちがったので編集してたら追加の投稿が…orz

No1929 (かのかの さん) に返信
順序が入れ替わっちゃいましたが、一応思いついた方法を上に書いときました。
引用返信 編集キー/
■1932 / inTopicNo.6)  Re[5]: テーブルのtdタグの中にRadioButton
□投稿者/ THREE-ONE (7回)-(2007/03/08(Thu) 22:49:27)
THREE-ONE さんの Web サイト
Repeater の ItemDataBound を使って、FindControl で RadioButtonList を取得します。
そして、Items に ListItem を Add すれば、かのかのさんが最初に示されたソースと同じことができます。
ですが、実際にレンダリングされたとき、それぞれの RadioButton に設定される name 属性には、rptList:_ctrl1:optList のように修飾されます。
ですので、一つだけチェックされることを保障することはできません。
ぼのぼのさんの案を検討されるのがよろしいかと。
引用返信 編集キー/
■1946 / inTopicNo.7)  Re[6]: テーブルのtdタグの中にRadioButton
□投稿者/ かのかの (3回)-(2007/03/09(Fri) 17:39:24)
ぼのぼのさん>
 ItemDataBoundにコンテナをうめこんで表示をすることはできました!
 でも、何番目のデータが選択されたかを取得するにはどうしたらよいのでしょうか?
 質問ばかりで恐縮です。よろしくお願いします。

■ASP.VBのソース
Imports System
Imports System.IO
Public Class WebForm8
    Inherits System.Web.UI.Page

#Region " Web フォーム デザイナで生成されたコード "

    'この呼び出しは Web フォーム デザイナで必要です。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub
  Protected WithEvents Repeater1 As System.Web.UI.WebControls.Repeater
  Protected WithEvents btnData As System.Web.UI.WebControls.Button
  Protected WithEvents Label1 As System.Web.UI.WebControls.Label

    'メモ : 次のプレースホルダ宣言は Web フォーム デザイナで必要です。
    '削除および移動しないでください。
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        ' CODEGEN: このメソッド呼び出しは Web フォーム デザイナで必要です。
        ' コード エディタを使って変更しないでください。
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' ページを初期化するユーザー コードをここに挿入します。

        Dim values As New ArrayList

        values.Add(New setData("00001", "かのかの"))
        values.Add(New setData("00002", "たろう"))
        values.Add(New setData("00003", "次郎"))

        Repeater1.DataSource = values
        Repeater1.DataBind()
    End Sub

  Private Sub btnData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnData.Click
      '’誰が選択されたをラベルに表示する


  End Sub
End Class
Public Class setData
  Private s_intValue As String
  Private s_strName As String

  Public Sub New(ByVal newIntValue As String, ByVal newStrName As String)

      Me.s_intValue = newIntValue
      Me.s_strName = newStrName
  End Sub

  Public ReadOnly Property intValue() As String
    Get
    Return s_intValue
  End Get
  End Property

  Public ReadOnly Property strName() As String
    Get
    Return s_strName
  End Get
  End Property
End Class

■ASPXのソース
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm8.aspx.vb" Inherits="WebApplication2.WebForm8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <title>WebForm8</title>
  <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
  <meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
  <meta content="JavaScript" name="vs_defaultClientScript">
  <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
 </HEAD>
 <body MS_POSITIONING="GridLayout">
  <form id="Form1" method="post" runat="server">
   <asp:repeater id="Repeater1" runat="server">
    <HeaderTemplate>
     <table border="1">
      <tr>
       <td>
        選択
       </td>
       <td>
        データ
       </td>
      </tr>
    </HeaderTemplate>
    <ItemTemplate>
     <tr>
      <td>
       <asp:Literal ID="ltlSelect">
        <input runat="server" type=radio name = "select"  value ='<%# DataBinder.Eval(Container.DataItem, "intValue") %>'/>
       </asp:Literal>
      </td>
      <td>
       <%# DataBinder.Eval(Container.DataItem, "strName") %>
      </td>
     </tr>
    </ItemTemplate>
    <FooterTemplate>
     </table>
    </FooterTemplate>
   </asp:repeater>
   <asp:Button id="btnData" Text="何番目?" runat="server"></asp:Button><br>
   <asp:Label id="Label1" runat="server">が選択されました</asp:Label>
  </form>
 </body>
</HTML>

THREE-ONEさん>
 必ず1件のみの選択としたいのでぼのぼのさん方式!でいきたいと思います。

引用返信 編集キー/
■1954 / inTopicNo.8)  Re[7]: テーブルのtdタグの中にRadioButton
□投稿者/ THREE-ONE (8回)-(2007/03/09(Fri) 23:50:18)
THREE-ONE さんの Web サイト
PostBack 時に、Request["select"] で選択された値が取得できると思いますよ。
引用返信 編集キー/
■1956 / inTopicNo.9)  Re[8]: テーブルのtdタグの中にRadioButton
□投稿者/ ぼのぼの (23回)-(2007/03/10(Sat) 00:50:15)
No1954 (THREE-ONE さん) に返信
> PostBack 時に、Request["select"] で選択された値が取得できると思いますよ。
細かいですが、VBなのでRequest("select")ですね。

■No1946 (かのかの さん) に返信
> ぼのぼのさん>
>  ItemDataBoundにコンテナをうめこんで表示をすることはできました!

おめでとうございます(^^
でも私が当初想定してた方法と微妙に違いますね。
#勿論違うことに問題はありません。正解はひとつじゃないですから。
当初想定してたのは、aspxには

  <asp:Literal ID="ltlSelect" runat="server"></asp:Literal>

とだけ書いておいて、サーバ側(aspx.vb)のRepeater1_ItemDataBoundで

  DirectCast(e.Item.FindControl("ltlSelect"), Literal).Text = "<input type=radio ... />"

みたく書く、というものでした。

かのかのさんの方法ならLiteralは必要ありません。
あとラジオボタンにrunat="server"つけちゃダメです。

>        <asp:Literal ID="ltlSelect">
>         <input runat="server" type=radio name = "select"  value ='<%# DataBinder.Eval(Container.DataItem, "intValue") %>'/>
>        </asp:Literal>

この部分は、

          <input type=radio name = "select"  value ='<%# DataBinder.Eval(Container.DataItem, "intValue") %>'/>

これだけでおk。
ただしこれだけだとPostBack後にチェックが消えちゃうと思います。
そこで、こうゆうふうにしてみてください。

         <input type=radio name = "select"  value ='<%# DataBinder.Eval(Container.DataItem, "intValue") %>'
          <%# IIf(Request("select") = DataBinder.Eval(Container.DataItem, "intValue"), "checked", "") %> />

なぜこれでうまくいくかは、じっくり考えればわかると思います。

引用返信 編集キー/
■2014 / inTopicNo.10)  Re[9]: テーブルのtdタグの中にRadioButton
□投稿者/ かのかの (4回)-(2007/03/13(Tue) 14:03:21)
THREE-ONEさん>
 ありがとうございます。さわやかにGetできました☆
ぼのぼのさん>
 何度もありがとうございます。
 これだと普通のASPタグのテキストボックスではなく普通のInputタグのテキストボックスで
 IDは自分で指定してRequestでとればできるんですね☆
 回答が遅くなりましたが、できました。本当にありがとうございます。
 一気にいろいろ解決できました。あとはモリモリ作るだけです。
 またわからないことがありましたらよろしくお願いします。

※参考までにかのかのがかいたソースです。ベタ&汚いですが、初心者ゆえおゆるしくださいませ。
■ASPXのソース
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm10.aspx.vb" Inherits="WebApplication2.WebForm10"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>WebForm8</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:repeater id="rptList" runat="server">
<HeaderTemplate>
<table border="1">
<tr>
<td>
選択
</td>
<td>
データ
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Literal ID="ltlSelect" runat="server"></asp:Literal>
</td>
<td>
<asp:Literal ID="ltlName" runat="server"></asp:Literal>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:repeater><asp:button id="btnData" runat="server" Text="何番目?"></asp:button><br>
<asp:label id="Label1" runat="server">が選択されました</asp:label>
</form>
</body>
</HTML>
■ASP.VBのソース
Public Class WebForm10
Inherits System.Web.UI.Page

#Region " Web フォーム デザイナで生成されたコード "

'この呼び出しは Web フォーム デザイナで必要です。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub
Protected WithEvents rptList As System.Web.UI.WebControls.Repeater
Protected WithEvents ltlSelect As System.Web.UI.WebControls.Literal
Protected WithEvents ltlName As System.Web.UI.WebControls.Literal

Protected WithEvents btnData As System.Web.UI.WebControls.Button
Protected WithEvents Label1 As System.Web.UI.WebControls.Label

'RoomMate
Public Structure pRoomMateType
Dim strNumber As String '番号
Dim strName As String 'お名前
End Structure
Public pdateRoomMate() As pRoomMateType 'データを入れておく変数
Public pstrSelectNumber As String '選択されたやつ

'メモ : 次のプレースホルダ宣言は Web フォーム デザイナで必要です。
'削除および移動しないでください。
Private designerPlaceholderDeclaration As System.Object

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
' CODEGEN: このメソッド呼び出しは Web フォーム デザイナで必要です。
' コード エディタを使って変更しないでください。
InitializeComponent()

Dim strWork As String

''データの取得
Call mInit()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ページを初期化するユーザー コードをここに挿入します。
Dim values As New ArrayList
Dim intCnt As Integer

''データの取得
Call mInit()

''データ件数分データを埋め込みます。
For intCnt = 0 To UBound(pdateRoomMate)
''2レコード設定
values.Add(Nothing)
Next

rptList.DataSource = values
rptList.DataBind()

End Sub
''データ作成時
Private Sub rptList_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptList.ItemCreated

Dim intCnt As Integer
Dim strWork As String
Dim strJavaS As String
Dim Literal As Literal
Dim txtC_Name As TextBox
Dim strChecked As String
Dim strJavaN As String

'''データの取得
'Call mInit()

''現在データカウント
intCnt = e.Item.ItemIndex

''0件目以上から作成する
If e.Item.ItemIndex >= 0 Then
''選択済みデータなし
If pstrSelectNumber = "" Then
'1件目
If intCnt = 0 Then
strChecked = "checked"
Else
strChecked = ""
End If
''選択済みデータ有
Else
'今回データと等しい場合
If pdateRoomMate(intCnt).strNumber = pstrSelectNumber Then
strChecked = "checked"
Else
strChecked = ""
End If
End If

'ラジオボタン
strJavaS = "<input type='radio' name='select' value='" & pdateRoomMate(intCnt).strNumber & "'" & strChecked & " />"
'名前
strJavaN = "<input type='text' name='name" & intCnt & "' value='" & pdateRoomMate(intCnt).strName & "' />"

DirectCast(e.Item.FindControl("ltlSelect"), Literal).Text = strJavaS
DirectCast(e.Item.FindControl("ltlName"), Literal).Text = strJavaN
End If
End Sub

''ボタンがクリックされたとき
Sub btnData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnData.Click
'’誰が選択されたをラベルに表示する
Dim strWork As String

''データの取得
Call mInit()

strWork = Request("select").ToString

Label1.Text = strWork & "が選択されました。"
End Sub

Private Function mInit() As Boolean

Dim intCnt As Integer ''ループカウンター

''配列の初期化
Erase pdateRoomMate

''二人分データをセットする
ReDim Preserve pdateRoomMate(1)

'一人目
pdateRoomMate(0).strNumber = "000001"
pdateRoomMate(0).strName = "かのかの"

'二人目
pdateRoomMate(1).strNumber = "000002"
pdateRoomMate(1).strName = "太郎"

If IsPostBack Then
''選択済み状態ラジオボタン位置
pstrSelectNumber = Request("select")
   ''名前が変更された人のでーたも取得します。
For intCnt = 0 To UBound(pdateRoomMate)
pdateRoomMate(intCnt).strName = Request("name" & intCnt)
Next
End If
End Function
End Class

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -