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の問題か、ポストバックの動作を変更する構成設定があるかどうかはわかりません。
Page_LoadイベントとbtnSave_Clickイベントにブレークポイントを設定した場合、現在の動作を実際に確認できるのは 'If(IsPostBack){} else {}'だと思います。また 'ListItem liOption'はクラスレベルで静的または保護されたものとして作成します。セッション変数の使用法を学ぶことができます。場合はListItemとして戻って値を – MethodMan
私はPage_Loadで行う必要があるので、何もないので、If(IsPostBack)のelse {}は私には良いことではありません。 btnSave_Clickについては、私はブレークポイントを使ってSelectedプロパティの状態を確認しています。セッション変数を使用する方法はわかっていますが、ポストバックを実行せずにセッションの各リストの各チェックボックスに状態を格納する方法がわかりません。他のすべての値はViewStateで引き継がれますが、なぜ選択したプロパティはありませんか? – BrycePat