如何从CheckboxList获取更新(更改的项目)?

时间:2009-12-19 19:12:24

标签: c# asp.net datasource checkboxlist listitem

我的页面中有一个Checkbox列表,并且在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中没有效果。的为什么???

请帮助!

2 个答案:

答案 0 :(得分:0)

看起来是因为你在回发时再次重新设置值,有效地清除了用户的选择。您只需在不是回发时初始化值。

答案 1 :(得分:0)

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

此行会在每个页面加载时触发,因此会重置选择(至少将选定的选项设置为true)。不应该在那里!Page.IsPostback呢?在更新按钮中,您可以重新绑定...

如果您需要确定更改的内容,则需要再次查询数据源中的项目,并根据新的选择列表交叉引用这些项目。