<form runat="server">
<asp:Repeater ID="RptCheckBox" runat="server">
<ItemTemplate>
<asp:CheckBox ID="ChkSelect" runat="server" Text="選択" />
<ItemTemplate>
</asp:Repeater>
<asp:Button ID="BtnPostBack" runat="server" Text="送信" />
</form>
みたいなページで選択されたCheckBoxの項目だけ取得したいとき、ASP.NET WebFormsのCheckBoxコントロールにValueプロパティがなくて困るときがあるんじゃないかと思う。
そういうときに、
<asp:CheckBox ID="ChkSelect" runat="server" Text="選択" Value="hoge" />
とか、RepeaterのItemDataBoundイベント内で
var chkSelect = (CheckBox)e.Item.FindControl("ChkSelect");
chkSelect.Attribute.Add("value", "hoge");
とかやると、実際に出力されるHTMLが
<span value="hoge">
<input type="checkbox" name="RptCheckBox_ChkSelect_1" />
<label for="RptCheckBox_ChkSelect_1">選択</label>
</span>
ってなってなかなかvalueを取るのが面倒臭い。
そんなときはRepeaterのItemDataBoundイベントの中で
var chkSelect = (CheckBox)e.Item.FindControl("ChkSelect");
chkSelect.InputAttribute.Add("value", "hege");
ってやると
<input type="checkbox" name="RptCheckBox_ChkSelect_1" value="hoge" />
<label for="RptCheckBox_ChkSelect_1">選択</label>
という風にHTMLが出力されるので、CheckBoxのvalueが取れるようになる。
valueを取りたいときは
var values = Request.Form.AllKeys.Where(keys => keys.Contains("ChkItem")).Select(key => Request.Form[key]);
ってやればIEmunerableで選択されたCheckBoxのvalueが取れる。
Repeaterの中にCheckBoxがなくても、コードビハインドで
ChkSelect.InputAttribute.Add("value", "hoge");
でvalueが指定できるし、valueを取るときは
string value;
if (ChkSelect.Selected)
value = ChkSelect.InputAttribute["value"];
で取れる。