inohilog

/var/log/inohiro.log

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がセットされてほしい。ううむ。これは困る。。。

追記1

どうやら途中まではちゃんと「Value = "1"」になってる。

このあとHtmlに変換されるとTextのコピーになっちゃってるOTL。

追記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が再度呼ばれて、初期化されてるっぽい