HtmlRadioButtons
私は、ユーザーがチェックすることになっている、1つのテキストと複数のテキストでテーブル行を埋めるリピーターを持っています。リストは非常に大きくなる可能性があるため、最初のN行のみをチェックする必要があります。これをユーザーに示すために、最初のオプションの行の前に、説明テキストを含むTableRow
1つTableCell
(colspan = 4)を追加します。この行をリピーターに追加しItemDataBound
ます。
ポストバックでは、追加の行を挿入する前の1つの項目を除いて、追加の行の前後のすべてのチェックされたラジオボタンがチェックされた値で戻ります。追加の行( 、、および)のタイプを変更してみました。また、追加の行を変更してみました。ただし、この行/ラジオボタンでチェック値をポストバックすることはできません。常にfalseです。Html/RadioButton
Html/TableRow
Html/TableCell
EnableViewState
この値がポストバックしない理由を誰かが知っていますか?
ラジオボタンがポストバックするのを妨げずに行を追加する方法を知っている人はいますか?
追記:
OnClick
すべての値を一度に処理して保存するのが好きなので、ラジオボタンにを追加したくありません。- 元のデータをにダウンロードします
Page_Load
が、他の行/ラジオボタンでは問題ないようです。
これは単純化された凝縮されたコードです。ASPX:
<ItemTemplate>
<asp:TableRow runat="server">
<asp:TableCell ID="CategoryName" CssClass="td_1" Text='<%# Eval("Name") %>'/>
<asp:TableCell CssClass="td_radio" runat="server">
<asp:HtmlInputRadioButton type="radio" runat="server"
ID="rdBelonging"
Name='<%# Eval("Id") %>'
value='<%# (int)Enum_BelongsToCategory.Belonging %>'
data-value='<%# Convert.ToBoolean(Eval("ShouldJudge")) ? "mandatory" : "optional" %>'/>
</asp:TableCell>
<asp:TableCell CssClass="td_radio" runat="server">
<asp:HtmlInputRadioButton type="radio" runat="server"
ID="rdNotBelonging"
Name='<%# Eval("Id") %>'
value='<%# (int)Enum_BelongsToCategory.NotBelonging %>'
data-value='<%# Convert.ToBoolean(Eval("ShouldJudge")) ? "mandatory" : "optional" %>'/>
</asp:TableCell>
<%-- more Enum_BelongsToCategory-ReadioButtons... --%>
</asp:TableRow>
</ItemTemplate>
行を追加するための背後にあるコード(このExperts-Exchange-post Repeater Control-別のテーブル行の追加に触発されました:
protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
// first get item and show previous checks (if any)
// ...
if ( (lDataItem.ShouldJudge == false) && (_prevShouldJudge) ) {
var lCell = new TableCell { ColSpan = 4, InnerText = "(minimum to check)" };
var lRow = new TableRow();
lRow.Cells.Add(lCell);
e.Item.Controls.AddAt(0, lRow);
}
_prevShouldJudge = lDataItem.ShouldJudge;
}
}
チェックされたラジオボタンを見つけるための背後にあるコード(システムブログのこのチーフに触発されて、aspnetでチェックされたラジオボタンを見つけます)
private void SaveCategoryJudgements(Product product)
{
int lRepeaterItemCount = 0;
foreach (RepeaterItem lItem in repeaterCategories.Items) {
lRepeaterItemCount ++;
var lCheckedRadioButton = GetCheckedRadioButton(lItem.Controls);
if (lCheckedRadioButton != null) {
int lCategoryId;
int lJudgement;
if ( (int.TryParse(lCheckedRadioButton.Attributes["value"], out lJudgement))
&& (int.TryParse(lCheckedRadioButton.Name, out lCategoryId)) )
{
ClassificationData.SaveDocumentCategoryByUser(product, lCategoryId, (Enum_BelongsToCategory)lJudgement);
}
}
}
}
public HtmlInputRadioButton GetCheckedRadioButton(ControlCollection controls)
{
foreach (Control lControl in controls) {
if (lControl is HtmlInputRadioButton) {
var lRadioButton = (HtmlInputRadioButton)lControl;
if (lRadioButton.Checked == true)
{
return lRadioButton;
}
}
else {
var lRadioButton = GetCheckedRadioButton(lControl.Controls);
if (lRadioButton != null) {
return lRadioButton;
}
}
}
return null;
}