【发布时间】:2016-06-23 20:25:19
【问题描述】:
我有一个嵌套在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 构建的另一个项目。我不确定这是 Mono 问题还是存在更改回发行为的配置设置。
【问题讨论】:
-
我认为您将拥有
If(IsPostBack){ } else{ },如果您在 Page_Load 事件和 btnSave_Click 事件中设置断点,您实际上可以检查当前的行为。还ListItem liOption在类级别将其创建为静态或受保护的。或者学习使用 Session 变量。并将值返回为 ListItem -
If(IsPostBack) 上的一个 else{ } 对我没有任何好处,因为我在 Page_Load 中没有其他需要做的事情。至于 btnSave_Click 我使用断点来确认 Selected 属性的状态。我知道如何使用会话变量,但我不确定如何在不执行回发的情况下将状态存储到会话中每个列表中的每个复选框。所有其他值都在 ViewState 中结转,为什么不是 selected 属性?
标签: c# asp.net checkboxlist