2016-06-23 7 views
-1

RepeaterのOnItemDataBoundで動的に設定されているRepeaterにネストされたCheckBoxListがあります。ボタンをクリックすると、各チェックボックスリストに変更を保存したいのですが、選択したプロパティはポストバック後に常に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

Page_LoadイベントとbtnSave_Clickイベントにブレークポイントを設定した場合、現在の動作を実際に確認できるのは 'If(IsPostBack){} else {}'だと思います。また 'ListItem liOption'はクラスレベルで静的または保護されたものとして作成します。セッション変数の使用法を学ぶことができます。場合はListItemとして戻って値を – MethodMan

+0

私はPage_Loadで行う必要があるので、何もないので、If(IsPostBack)のelse {}は私には良いことではありません。 btnSave_Clickについては、私はブレークポイントを使ってSelectedプロパティの状態を確認しています。セッション変数を使用する方法はわかっていますが、ポストバックを実行せずにセッションの各リストの各チェックボックスに状態を格納する方法がわかりません。他のすべての値はViewStateで引き継がれますが、なぜ選択したプロパティはありませんか? – BrycePat

答えて

0

私は最近、同様の問題を抱えていました。解決するために、クエリ文字列に保存することができます。

+0

これは本当に良い答えではありません。その場合、セッション変数に格納する方が良いでしょう。 – MethodMan

+0

セッション(またはQueryString)に格納するとどうすればいいですか?私はポストバック時にプロパティを失い、ユーザーがsave ....をクリックするまでどのチェックボックスが選択されているかわからない。 – BrycePat

+1

ページライフサイクルとポストバックが何であるか、そしてポストバックを引き起こすものを理解する必要があるため。これはjavascriptを使って、 '__DoPostBack'関数の使い方を調べるのが難しいことではありません@BrycePat – MethodMan

関連する問題