我有一个中继器用 1 个文本和多个填充表行,HtmlRadioButtons
用户应该检查。因为列表可能会变得非常大,所以只检查前 N 行是强制性的。为了向用户展示这一点,我在第一个可选行之前添加了一个额外TableRow
的(colspan=4) 和一些说明性文本。TableCell
我在中继器上添加了这一行ItemDataBound
。
在回发时,额外行之前和之后的所有选中单选按钮都会返回它们的选中值,除了我在之前插入额外行的一项。我尝试改变额外行(和)的类型,并尝试改变Html/RadioButton
额外行。但是我不能让这个行/单选按钮回发检查值,它总是错误的。Html/TableRow
Html/TableCell
EnableViewState
有谁知道为什么这个值不回发?
有人知道如何在不阻止单选按钮回发的情况下添加额外的行吗?
额外说明:
- 我不想向
OnClick
单选按钮添加一个,因为我喜欢一次处理和存储所有值 - 我将原始数据下载到 中
Page_Load
,但这对于其他行/RadioButtons 来说似乎不是问题
这是简化的压缩代码。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;
}
}
找到选中的 RadioButton 背后的代码(灵感来自系统博客的这个 Chief of the System Blog find checked radio-button in 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;
}