0

ページにチェックボックス リストがあり、そのデータソースがプログラムで PreLoad() イベントに設定されています。

protected void Page_PreLoad()
{
        if (!Page.IsPostBack)
        {
        CheckBoxList1.DataSource = NoK.AcceptedNoks((Guid)Membership.GetUser().ProviderUserKey);
        CheckBoxList1.DataTextField = "FullName";
        CheckBoxList1.DataValueField = "NoKId";
        CheckBoxList1.DataBind();
        }
foreach (ListItem chk in CheckBoxList1.Items)
{
    if (PrivateMessage.HasAccess(Request.QueryString["MessageId"], chk.Value))
    {
        chk.Selected = true;
    }
}

}

foreach でわかるように、アイテムをチェックする必要があるかどうかをチェックします。そしてそれはうまくいきます。これは、エンド ユーザーがリスト アイテムを編集できることを意味し、デフォルトでは一部のアイテムがチェックされています。ボタンをクリックしてアイテムを取得したい:

protected void UpdateRightBtn_Click(object sender, EventArgs e)
{
    var SelectedNokIds =
        CheckBoxList1.Items
        .OfType<ListItem>()
        .Where(li =>
            li.Selected == true)
            .Select(l => new Guid(l.Value));
}

しかし、アイテムSelectedNokIdsはまだ古いアイテムであり、ユーザーがチェックボックスを変更しても、SelectedNokIds. どうして???

助けてください!

4

2 に答える 2

0

foreach (CheckBoxList1.Items の ListItem chk){ if (PrivateMessage.HasAccess(Request.QueryString["MessageId"], chk.Value)) { chk.Selected = true; }}

この行はページが読み込まれるたびに発生するため、選択がリセットされます (少なくとも、selected を true に設定したもの)。それは !Page.IsPostback 内にあるべきではありませんか? そして、更新ボタンで、そこに再バインドできます...

変更内容を把握する必要がある場合は、データ ソース内の項目を再度クエリし、それらを新しい選択リストと相互参照する必要があります。

于 2009-12-21T02:59:34.917 に答える
0

ポストバック時に値を再設定し、ユーザーの選択を効果的にクリアしているためのようです。ポストバックでない場合にのみ、値を初期化する必要があります。

于 2009-12-19T19:15:57.063 に答える