我有一个嵌套在Repeater中的CheckBoxList,它在Repeater的OnItemDataBound中动态填充。在按钮上单击我想将更改保存到每个复选框列表,但在回发后所选属性始终为TRUE。
HTML:
<asp:Repeater id="rptFields" runat="server" OnItemDataBound="rptField_OnItemDataBound">
<ItemTemplate>
<asp:HiddenField id="hFieldID" runat="server" Value='<%#DataBinder.Eval(Container.DataItem,"ID")%>' />
<asp:Label id="lblDesc" runat="server" Text='<%#DataBinder.Eval(Container.DataItem,"Description")%>' />
<asp:CheckBoxList id="chkOptions" runat="server" ></asp:CheckBoxList>
</ItemTemplate>
</asp:Repeater>
<asp:Button id="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" />
代码背后:
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{
rptFields.DataSource = Fields;
rptFields.DataBind();
}
}
protected void rptField_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item)
|| (e.Item.ItemType == ListItemType.AlternatingItem)
{
CheckBoxList chkOptions = (CheckBoxList)e.Items.FindControl("chkOptions");
Field ThisField = (Field)e.Item.DataItem;
for (int i = 0; i < ThisField.Options.Length; i++)
{
ListItem liOption = new ListItem (ThisField.Options [i].Description, ThisField.Options [i].ID.ToString ());
liOption.Selected = ThisField.Options [i].Selected;
chkOptions.Items.Add (liOption);
}
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
foreach (RepeaterItem rptItem in rptFields)
{
int iFieldID = int.parse(rptItem.FindControl("hFieldID"));
Field ThisField = GetFieldByID(iFieldID);
CheckBoxList chkOptions = (CheckBoxList)rptItem.FindControl("chkOptions");
foreach(Option ThisOption in ThisField.Options)
{
for(int i = 0;i < chkOptions.Items.Count; i++)
{
int OptionID = int.parse(chkOptions.Items[i].Value);
if(ThisOption.ID == OptionID)
{
//HERE IS THE PROBLEM
//SELECTED IS ALWAYS TRUE
ThisOption.Selected = chkOptions.Items[i].Selected;
ThisOption.Save();
}
}
}
}
}
转发器中的所有数据都会持续存在,包括复选框列表项的文本和值字段。除所选房产外的所有房产。
我搜索并搜索了答案,但没有答案。每个类似的问题都是人们在每个回发中重新绑定列表。正如你所看到的那样,并非如此。而对于它的价值,完全相同的解决方案适用于单选按钮列表没有问题。
编辑:为了记录这个项目正在运行Mono.net 4.5
更新:同样的解决方案适用于我们使用.Net 2.0构建的另一个项目。我不确定它是否是单声道问题,或者是否有配置设置可以改变帖子的行为。
答案 0 :(得分:0)
我最近遇到了类似的问题,要解决它你可以将它存储在querystring中。