こちらの方も悩んでいましたね。
解決方法が分かったので共有します。
d.hatena.ne.jp
直面している問題
以下のようにすると、ValueにTextの値が入ってしまいます。
<asp:RadioButtonList DataSource="<%# GetItemList() %>" ID="RadioButtonList" runat="server" /> <asp:CheckBoxList DataSource="<%# GetItemList() %>" ID="CheckBoxList" runat="server" />
DataSourceの定義。このListItemの第二引数の値は無視されてしまいます。
protected ListItemCollection GetItemList() { var items = new ListItemCollection(); items.Add(new ListItem("要素1", "1")); items.Add(new ListItem("要素2", "2")); return items; }
出力結果(見るべき箇所だけ切り抜いてます)
<input id="RadioButtonList_0" type="radio" name="RadioButtonList" value="要素1"><label for="RadioButtonList_0">要素1</label> <input id="RadioButtonList_1" type="radio" name="RadioButtonList" value="要素2"><label for="RadioButtonList_1">要素2</label> <input id="CheckBoxList_0" type="checkbox" name="CheckBoxList$0" value="要素1"><label for="CheckBoxList_0">要素1</label> <input id="CheckBoxList_1" type="checkbox" name="CheckBoxList$1" value="要素2"><label for="CheckBoxList_1">要素2</label>
valueと表示部どちらにもListItemの第一引数の値が入ってしまっていますね。
期待するのは、valueにはListItemの第二引数の1とか2が入ることですね。
解決方法
DataTextField属性とDataValueField属性を明示的に指定するとvalueの値はちゃんとvalueに入ります。
<asp:RadioButtonList DataTextField="Text" DataValueField="Value" DataSource="<%# GetItemList() %>" ID="RadioButtonList" runat="server" /> <asp:CheckBoxList DataTextField="Text" DataValueField="Value" DataSource="<%# GetItemList() %>" ID="CheckBoxList" runat="server" />
出力結果
<input id="RadioButtonList_0" type="radio" name="RadioButtonList" value="1"><label for="RadioButtonList_0">要素1</label> <input id="RadioButtonList_1" type="radio" name="RadioButtonList" value="2"><label for="RadioButtonList_1">要素2</label> <input id="CheckBoxList_0" type="checkbox" name="CheckBoxList$0" value="1"><label for="CheckBoxList_0">要素1</label> <input id="CheckBoxList_1" type="checkbox" name="CheckBoxList$1" value="2"><label for="CheckBoxList_1">要素2</label>
今度はちゃんとvalueにListItemの第二引数が入っていますね。
ListItemの第一引数はText
第二引数はValue
という扱いですが、RadioButtonListとCheckBoxListが勝手に認識してくれるわけではないということですね。