У меня есть CheckBoxList, вложенный в ретранслятор, который динамически заполняется в OnItemDataBound Repeater. При нажатии кнопки я хотел бы сохранить изменения в каждом списке флажков, но выбранное свойство всегда TRUE после обратной передачи..net CheckBoxList потерял выбранное свойство после обратной передачи
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();
}
}
}
}
}
Все данные ретранслятора сохраняется, в том числе текст и значение полей проверочных окна списка элементов. Все, кроме выбранного свойства.
Я искал и искал ответ и не существует. Каждая подобная проблема заключалась в том, что люди перевязывали список в каждой обратной передаче. Как вы видите, это не так. И для чего это стоит, то же самое решение работает для списков переключателей без проблем.
EDIT: Для записи этого проекта работает Mono.net 4.5
UPDATE: То же решение работает в другом проекте мы построили с помощью .Net 2.0. Я не уверен, что это проблема с Mono или есть параметр конфигурации, который изменяет поведение сообщения.
Я бы подумал, что у вас будет 'If (IsPostBack) {} else {}', вы можете проверить поведение того, что у вас есть, если вы установите точки останова в событии Page_Load, а также ваше событие btnSave_Click. также 'ListItem liOption' создает это как статическое или защищенное на уровне класса. или научиться использовать переменные сеанса. и если значения возвращаются как ListItem – MethodMan
An else {} в If (IsPostBack) не делает мне ничего хорошего, потому что у меня нет ничего, что нужно сделать в Page_Load. Что касается btnSave_Click, я использую точки останова, чтобы подтвердить состояние свойства Selected. Я знаю, как использовать переменные сеанса, но я не уверен, как я буду хранить состояние для каждого флажка в каждом списке в сеансе без выполнения обратной передачи. Все остальные значения переносятся в ViewState, почему не выбранное свойство? – BrycePat