2016-06-23 3 views
-1

У меня есть 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 или есть параметр конфигурации, который изменяет поведение сообщения.

+0

Я бы подумал, что у вас будет 'If (IsPostBack) {} else {}', вы можете проверить поведение того, что у вас есть, если вы установите точки останова в событии Page_Load, а также ваше событие btnSave_Click. также 'ListItem liOption' создает это как статическое или защищенное на уровне класса. или научиться использовать переменные сеанса. и если значения возвращаются как ListItem – MethodMan

+0

An else {} в If (IsPostBack) не делает мне ничего хорошего, потому что у меня нет ничего, что нужно сделать в Page_Load. Что касается btnSave_Click, я использую точки останова, чтобы подтвердить состояние свойства Selected. Я знаю, как использовать переменные сеанса, но я не уверен, как я буду хранить состояние для каждого флажка в каждом списке в сеансе без выполнения обратной передачи. Все остальные значения переносятся в ViewState, почему не выбранное свойство? – BrycePat

ответ

0

У меня была подобная проблема недавно, чтобы решить ее, вы можете сохранить ее в querystring.

+0

Это не очень хороший ответ. В этом случае было бы лучше сохранить его в переменной сеанса. – MethodMan

+0

Что бы это могло сделать в сеансе (или QueryString)? Я теряю свойство при обратной передаче и не знаю, какие флажки выбраны до тех пор, пока пользователь не нажмет на сохранение .... – BrycePat

+1

, потому что вам нужно понять жизненный цикл страницы, а также какие обратные вызовы и какие триггеры возвращают .. вы также можете выполнить это с помощью javascript также посмотрите, как использовать функцию '__DoPostBack', что вы пытаетесь сделать, это не сложно @BrycePat – MethodMan

Смежные вопросы