RadioButtonList.DataSourceに動的にListItemをセットしてるんだけど、ValueにTextの内容が入ってしまう
RadioButtonList.DataSourceに動的にListItemをセットしてるんだけど、ValueにTextの内容が入ってしまう。
ひさしぶりにASP.NETです。
<asp:RadioButtonList runat="server" ID="RadioButton" />
に、
ListItemCollection collection = new ListItemCollection(); collection.Add( new ListItem( "静的なHTMLや画像データをFTPアップロードし、ファイルマネージャで管理", "1" ) ); collection.Add( new ListItem( "コンテンツ管理システム(CMS)やブログシステムなどによる管理", "2" ) ); collection.Add( new ListItem( "わからない", "3" ) ); this.RadioButton.DataSource = collection; this.RadioButton.DataBind();
こんな感じでItemを追加(DataSourceのセット)。
しかし生成されるHtmlが、
<td><input id="RadioButton_0" type="radio" name="RadioButton" value="静的なHTMLや画像データをFTPアップロードし、ファイルマネージャで管理" /><label for="RadioButton_0">静的なHTMLや画像データをFTPアップロードし、ファイルマネージャで管理</label></td> <td><input id="RadioButton_1" type="radio" name="RadioButton" value="コンテンツ管理システム(CMS)やブログシステムなどによる管理" /><label for="RadioButton_1">コンテンツ管理システム(CMS)やブログシステムなどによる管理</label></td> <td><input id="RadioButton_2" type="radio" name="RadioButton" value="わからない" /><label for="RadioButton_2">わからない</label></td>
こんな感じ。ListItemのコンストラクタの第2引数がListItem.Value(Int32型)にあたるので、
<td><input id="RadioButton_0" type="radio" name="RadioButton" value="1" /><label for="RadioButton_0">静的なHTMLや画像データをFTPアップロードし、ファイルマネージャで管理</label></td>
こんな感じにValueがセットされてほしい。ううむ。これは困る。。。
追記2
それだけじゃない。
this.RadioButton.SelectedItem
とかで選択された項目の情報を引っ張ってこようとしたら、選択されてない(-1)ことになってる。うひーなんで*1。あらーおかしいなぁ。さっきまで出来てたのに(はずなのに)。
追記3
やはり「選択してボタンを押す」をした後に「Page_Load」がもう一度呼ばれてる。こういうaspxファイルに対して、
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="RadioButtonSelectedItem._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <div> <asp:RadioButtonList runat="server" ID="radioButtonList" /> <br /> <asp:Button runat="server" ID="goButton" Text="GO!" OnClick="goButton_click" /> <span style="color:Red;"><asp:Label runat="server" ID="resultLabel" Visible="false" /></span> </div> </form> </body> </html>
こんな感じで、初期化されたか否かの「IsInit」をStaticで持っておくと2度目に呼ばれたときにListCollectionを作るところが呼ばれてない。
using System; using System.Web.UI.WebControls; namespace RadioButtonSelectedItem { public partial class _Default : System.Web.UI.Page { static bool IsInit = false; protected void Page_Load( object sender, EventArgs e ) { if( !IsInit ) { ListItemCollection col = new ListItemCollection(); col.Add( new ListItem( "Hello, World", "1" ) ); col.Add( new ListItem( "Enterprise", "2" ) ); col.Add( new ListItem( "University of TKB", "3" ) ); this.radioButtonList.DataSource = col; this.radioButtonList.DataBind(); IsInit = true; } } protected void goButton_click( object sender, EventArgs e ) { if( this.radioButtonList.SelectedItem != null ) { this.resultLabel.Text = String.Format( "Text: {0}, Value: {1}", radioButtonList.SelectedItem.Text, radioButtonList.SelectedItem.Value ); this.resultLabel.Visible = true; } } } }
追記4
そもそもPage_Loadでページの中身を動的に帰るのは御法度なのかしら。
*1:Page_Loadが再度呼ばれて、初期化されてるっぽい